HDOJ HDU 1003 Max Sum
2017-09-02 11:56
465 查看
HDOJ 1003 Max Sum
题目
点击查看 HDOJ 1103 Max Sum题意
给t组数据行首是序列个数n 接着为n个数的序列
求该序列的连续最大和
难点
动态规划策略 或 贪心策略题解
看到有人用动态规划但是我觉得此题用贪心最易懂直接
贪心算法
从和为非负数的位置(起始位置)开始到当前位置的最大序列和和与所有最大序列和作比较,取最大值保存并区间始末
关键
当前序列和值为负数时,序列一定终止(否则之后的序列会变小)
举例
序列 0 6 -1 1 -6 7 -8 7 1
当前序列 | 当前最大和 | 序列最大和 | 最大序列首 | 最大序列末 |
---|---|---|---|---|
1 - 1 | 0 | 0 | 1 | 1 |
1 - 2 | 6 | 6 | 1 | 2 |
1 - 3 | 5 | 6 | 1 | 2 |
1 - 4 | 6 | 6 | 1 | 2 |
1 - 5 | 0 | 6 | 1 | 2 |
1 - 6 | 7 | 7 | 1 | 6 |
1 - 7 | -1 | 7 | 1 | 6 |
8 - 8 | 7 | 7 | 1 | 6 |
8 - 9 | 8 | 8 | 8 | 9 |
技巧
宏定义32位int的- 1#define ninf 0x80000000
代码
#include <iostream> #define ninf 0x80000000 #define max 100000 using namespace std; int a[max]; int main() { int t,n,f,l,tf,tl,res,sum; cin >> t; for(int z = 1;z <= t;z++) { cin >> n; tf = tl = f = 0; sum = 0; res = ninf; for(int i = 0;i < n;i++) { cin >> a[i]; sum += a[i]; if(sum > res) { tf = f; tl = i; res = sum; } if(sum < 0) { f = i+1; sum = 0; } } cout << "Case " << z << ":" << endl; cout << res << " " << tf + 1 << " " << tl + 1 << endl; if(z != t) cout << endl; } return 0; }
相关文章推荐
- HDOJ(HDU).1003 Max Sum (DP)
- HDU-1003-Max Sum(DP)
- Max Sum---HDU - 1003
- HDU-1003 Max Sum 动态规划
- HDU 1003 Max Sum
- hdu 1003 Max Sum (最大连续子序列)
- hdu_1003_Max Sum
- HDU 1003 Max Sum 最长连续子序列和
- HDU 1003 Max Sum
- HDOJ 1003 Max Sum
- HDOJ_1003_Max Sum
- Problem A:Max Sum(HDU 1003)
- hdu 1003 Max Sum
- hdu 1003 Max Sum
- HDU 1003 Max Sum
- hdu 1003 Max Sum 动态规划
- (HDOJ 1003)Max Sum
- HDU 1003 Max Sum
- HDU 1003 Max Sum --- 经典DP
- HDU 1003 Max Sum