hdu1003(水dp)

状态转移方程:sum = sum > 0 ? sum + a[i] : a[i] ; 第一个sum是前i个数的和,后面的两个sum是前(i-1)个是的和;如果i前面的和是小于0的,那么加上第i个数肯定比i要小,所以只取第i个数即a[i],如果是大于0的,则就加上。
而这里,都不需要用数组存下每个数,只用一个个读,判断就好。

/* 本题的状态方程:sum = sum > 0 ? sum+a:a; */ 
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
    int T;
    scanf("%d",&T);
    for(int step=1;step<=T;step++)
    {
        int n,s,e,k,sum=0,Max=-1000;
        s=e=k=1;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            int a;
            scanf("%d",&a);
            sum+=a;
            if(sum>Max)
            {
                s=k;
                e=i;
                Max=sum;
            }
            if(sum<0)
            {
                sum=0;
                k=i+1;
            }
        }
        if(step!=1) printf("\n");
        printf("Case %d:\n",step);
        printf("%d %d %d\n",Max,s,e);
    }
}

你可能感兴趣的:(hdu1003(水dp))