HDOJ 1003 Max Sum
题意: 给定一个数组序列,求连续的一段子序列之和最大,并输出其和以及起始位置和终止位置。
思路:第一道DP题目,sum[i] 表示以i 为终点的最大和,起始位置用st[i]保存。
6959568 | 2012-10-21 10:29:52 | Accepted | 1003 | 15MS | 1392K | 732 B | C++ | 罗维 |
View Code
#include <iostream> using namespace std; #define N 100002 int a[N]; int sum[N]; //以sum[i] 为终点的最大值 int st[N]; //以位置i向前扩展 int main() { int t, n; int maxx, tmp; int i, j; int it = 1; scanf("%d", &t); while (t--) { scanf("%d", &n); for (i=1; i<=n; i++) scanf("%d", &a[i]); sum[1] = a[1]; maxx = a[1]; tmp = 1; st[1] = 1; for (i=2; i<=n; i++) { if (sum[i-1]>= 0) //只要不是负数就加进来 { sum[i] = sum[i - 1] + a[i]; st[i] = st[i - 1]; } else { sum[i] = a[i]; st[i] = i; } if (sum[i] > maxx) { maxx = sum[i]; tmp = i; } } printf("Case %d:\n", it++); printf("%d %d %d\n",maxx,st[tmp], tmp ); if(t > 0) printf("\n"); } return 0; }