h1231动态规划

来源:互联网 发布:全民淘宝客程序 编辑:程序博客网 时间:2024/05/22 13:59

最大连续子序列,先用递推写了一个,过了

//u1231
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int a[10005];
int main()
{
    int n;
    while(scanf("%d",&n)&&n!=0)
    {
        for(int i=0; i<n; i++)
        {
            scanf("%d",&a[i]);
        }
        int max=-1,now=0,left=a[0],right=a[0],t=a[0],flag=0,ff=0;
        for(int i=0; i<n; i++)
        {
            now=now+a[i];
            if(flag==1)
            {
                flag=0;
                t=a[i];
            }
            if(now>max)
            {
                ff=1;
                left=t;
                right=a[i];
                max=now;
            }
            if(a[i]<0&&now<0)
            {
                flag=1;
                now=0;
            }
        }
        if(ff==0)
            printf("0 %d %d\n",a[0],a[n-1]);
        else
            printf("%d %d %d\n",max,left,right);
    }
    return 0;
}

这部分的动态规划可以把最大值找出来,不过找端点觉得递推省事些

//u1231
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int a[10005],c[10005];
int main()
{
    int n;
    while(scanf("%d",&n)&&n!=0)
    {
        for(int i=0; i<n; i++)
        {
            scanf("%d",&a[i]);
        }
        c[0]=a[0];
        for(int i=1;i<n;i++)
        {
            c[i]=max(c[i-1]+a[i],a[i]);
            printf("%d\n",c[i]);
        }
    }
    return 0;
}

0 0