题目:
给你一个序列a[1],a[2],a[3]......a[n], 你的任务是去计算这个序列中和最大的一个子序列. 例如, 给你个序列(6,-1,5,4,-7), 和最大的一个子序列是 6 + (-1) + 5 + 4 = 14.
本题目是求最大(连续)子序列的和
Input
在第一行输入一个数 T(1<=T<=100000) 意思是输入序列的个数. 然后后面T行, 每行开始一个数是N(1<=N<=100),这个序列有N个数, 然后接下来有N个数(每个数的范围是 -1000到 1000).
Output
对每个测试,输出子序列和的最大值(此题子序列长度至少为1)。
Sample Input
2
5 6 -1 5 4 -7
7 0 6 -1 1 -6 7 -5
Sample Output
14
7
分析:
简单dp问题,设dp[i]表示是以i为结尾的连续子序列的最大和,显然,若dp[i]〉0,则dp[i+1]=a[i+1]+dp[i];若dp[i]<0,则dp[i+1]=a[i+1];然后遍历dp数组便可得答案。
AC代码:
#include <iostream>
#include <cstdio>
using namespace std;
int a[100000]={},dp[100000]={};
int main()
{
int t,i;
cin>>t;
while(t--)
{
int n;
scanf("%d",&n);
for(i=0;i<n;++i)
{
scanf("%d",&a[i]);
dp[i]=-2100000000;
}
dp[0]=a[0];
int ans=a[0];
for(i=1;i<n;++i)
{
if(dp[i-1]<=0)
dp[i]=a[i];
else
dp[i]=dp[i-1]+a[i];
ans=max(ans,dp[i]);
}
printf("%d\n",ans);
}
return 0;
}