题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003
方法:DP
思路:本题就是求最大连续子序列和,很明显是DP。思路是先开始扫描数组,从1开始,不断求和,并比较和与最大值的关系,这一过程可以在输入过程中就能完成,当和大于最大值的时候,说明加上的当前数应算作最大和子序列当中,所以标记到结束endd里,如果加和小于最大值,说明当前数不能算如最大和子序列当中,如果加和出现了小于零的情况,这应该重新以下一个数作为起点开始寻找子序列,因为对于后面的数来说,如果继续加下去,和只能变小了,所以要重新开始计数,这样就完成了dp过程。
难点:DP的过程,重点掌握,主要是状态转移的过程。
#include <cstdio>
using namespace std;
int main()
{
int n;
int i,j;
int a[100000+10];
while(~scanf("%d",&n))
{
for(j = 1;j <= n;j++)
{
int num;
int sum = 0;
int k = 1;
int start,endd;
scanf("%d",&num);
int maxnum = -1010;//这里给出的数据大小是-1000~1000,因此设置一开始的最大值比-1000小即可
for(i = 1;i <= num;i++)
{
scanf("%d",&a[i]);//这里可一边输入一边处理
sum += a[i];
if(sum > maxnum)
{
maxnum = sum;
start = k;
endd = i;
}
if(sum < 0)
{
sum = 0;
k= i+1;
}
}
printf("Case %d:\n",j);
printf("%d %d %d\n",maxnum,start,endd);
if(j != n){printf("\n");}
}
}
}