HDU 1231 最大连续子序列和

来源:互联网 发布:品牌床垫推荐 知乎 编辑:程序博客网 时间:2024/05/17 09:37
这是动态规划的又一个经典问题。
这个还不是纯裸的题,需要稍微处理一下。
#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<queue>#include<algorithm>#include<map>#include<iomanip>const int inf=0x3f3f3f3f;const int maxn=10010;using namespace std;int sta[maxn];int main(){    int n;    while(scanf("%d",&n)==1,n)    {        memset(sta,0,sizeof(sta));        for(int i=1;i<=n;i++) scanf("%d",&sta[i]);        int maxsum,sum,f,l,ftemp;        maxsum=sum=-1; f=l=ftemp=sta[1];        for(int i=1;i<=n;i++)        {            if(sum>=0)            {                sum+=sta[i];                if(maxsum<sum)                    //当ftemp与l这个序列的和比maxsum还大的时候才更新f,即把ftemp赋值给f                {                    maxsum=sum;                    f=ftemp;                    l=sta[i];                   // printf("l更新为%d\n",sta[i]);                    //前面的元素不变。                }            }            else            {                sum=sta[i];                ftemp=sta[i];//这里只是把f更新了,因为这个f不一定是最后的f                if(maxsum<sum)                {                    maxsum=sum;                    l=sta[i];                    f=ftemp;                    //printf("f更新为%d\nl更新为%d\n",f,l);                }            }        }        if(maxsum<0) maxsum=0,f=sta[1],l=sta[n];        printf("%d %d %d\n",maxsum,f,l);    }}
AC代码