题目链接 NYOJ44
【分析】
很久以前就会做,但是一直没搞清原理,今天突然看到一个转移方程总算理解了,放在这里以后忘了再看吧,具体看代码注释
【AC代码】1676ms
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAXN 1000010
int a[MAXN], dp[MAXN];
//dp[i]表示以dp[i]结尾的子串的最大和;
/*转移方程dp[i] = max(dp[i-1]+a[i], a[i]);每次比较前一个子串加上当前值大,
如果比当前值都小只能把当前值作为新的连续子串和的开始*/
int main()
{
#ifdef SHY
freopen("e:\\1.txt","r",stdin);
#endif
int t;
scanf("%d%*c", &t);
while(t--)
{
int n, ans = -100;
scanf("%d%*c", &n);
for (int i = 1; i <= n; i++)
scanf("%d%*c", &a[i]);
dp[0] = 0;
for (int i = 1; i <= n; i++)
{
dp[i] = max(dp[i-1]+a[i], a[i]);
ans = max(ans,dp[i]);
}
printf("%d\n", ans);
}
return 0;
}