原文链接: HDU1003 Max Sum
下一篇: HDU2161
动态规划最大子序列和
注意最后一行不换行
已经有了最大和以及子序列的结束序号,通过循环获得开始的序号
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int dp[111111];
int a[111111];
int main(int argc, char *argv[]) {
int T;
scanf("%d", &T);
for(int time = 1; time <= T; time++) {
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d", a + i);
//初始化
dp[1] = a[1];
for(int i = 2; i <= n; i++)
dp[i] = max(a[i], dp[i - 1] + a[i]);
int maxend = 1, maxstart = 0;
for(int i = 2; i <= n; i++)
if(dp[i] > dp[maxend])
maxend = i;
int sum = dp[maxend];
for(int i = maxend; i >= 1; i--) {
sum -= a[i];
if(sum == 0) {
maxstart = i;
}
}
printf("Case %d:\n%d %d %d\n", time, dp[maxend], maxstart, maxend);
if(time != T)
printf("\n");
}
return 0;
}