HDU 1231 最大连续子序列

来源:互联网 发布:java打印日志logger 编辑:程序博客网 时间:2024/05/12 14:45

新手一只,如有错误,欢迎大神指出!!!



这是一道经典的DP题目,只不过需要输出子序列开始和结尾的元素。

我的想法就是用一个数组存储每一次找到的子序列的首尾坐标并记录。

可能解释的不清楚,所以直接上代码吧……


ac代码:

#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;__int64 a[10003],s[10003],sum[10003];int main(){    int k;    while(scanf("%d",&k)!=EOF&&k!=0)    {        for(int i=0;i<k;i++)        {            scanf("%I64d",&a[i]);        }        int cnt=0;        sum[0]=a[0];        s[0]=0;        for(int i=1;i<k;i++)        {            if(sum[i-1]>0)            {                sum[i]=sum[i-1]+a[i];                s[i]=s[i-1];//将起始坐标传递下去            }            else            {                sum[i]=a[i];                s[i]=i;//记录末尾坐标            }            if(sum[i]>sum[cnt])cnt=i;//将最大值在sum的坐标传递下去        }        if(sum[cnt]<0)            printf("0 %I64d %I64d\n",a[0],a[k-1]);        else            printf("%I64d %I64d %I64d\n",sum[cnt],a[s[cnt]],a[cnt]);    }    return 0;}


0 0