1003:Max Sum

来源:互联网 发布:html下拉框数据库 编辑:程序博客网 时间:2024/05/18 08:57

题目链接: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");}        }    }}



0 0