转载请注明出处:忆梦http://blog.csdn.net/yimeng2013/article/details/10343873
题目大意:求出最大的子序列的和,并且子序列的长度要尽量的长
题解:这是寒假时做的第一个dp题,今天来回顾一下,半年过去了感觉简单多了。
自行推算很容易得出状态转移方程为:sum = max(sum+a[i],a[i]),这个状态转移方程的意思就是:如果sum>=0,sum = sum + a[i]; 若sum<0,sum = a[i],
之前还需先定义一个ans,存储最大和;
#include<stdio.h>
int main ()
{
int T, Case = 1, n;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
int ans = -1001;
int sum = 0;
int l = 1, r = 0,temp_l = 1;
for(int i = 1; i <= n; i++)
{
int num;
scanf("%d", &num);
if(sum >= 0) sum += num;
else {sum = num; temp_l = i;}
if(sum > ans) {ans = sum; l = temp_l; r = i;}
}
printf("Case %d:\n",Case++);
printf("%d %d %d\n",ans, l, r);
if(T) printf("\n");
}
return 0;
}