最大连续子序列和

来源:互联网 发布:西游降魔篇 知乎 编辑:程序博客网 时间:2024/04/18 22:14


http://acm.hdu.edu.cn/showproblem.php?pid=1231

hd1231.

最大连续子序列和,

状态是 dp[i] = max(a[i], dp[i-1] + a[i])

以i结尾的最大和.

然后直接找dp[i]最大的.

其中s[i]是dp[i]中起点.

最后st来存s[i],end来存结尾.



#include<iostream>using namespace std;int main(){int n;int max=1,st,end;while(cin>>n){if(n==0)break;int f[10009],s[10009],a[10009];bool flag=0;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<=n;i++){if(a[i]>=0)flag=1;}if(flag){f[1]=a[1];s[1]=1;for(int i=2;i<=n;i++){if(f[i-1]+a[i]>=a[i]){f[i]=f[i-1]+a[i];s[i]=s[i-1];}else{f[i]=a[i];s[i]=i;}}max=-1;for(int i=1;i<=n;i++){if(max<f[i]){max=f[i];st=s[i];end=i;}}cout<<max<<" "<<a[st]<<" "<<a[end]<<endl;}elsecout<<0<<" "<<a[1]<<" "<<a[n]<<endl;}}
不知道为何wa
<pre name="code" class="cpp">#include<iostream>using namespace std;int a[10009];int f[1009];int s[1009];//记录最大连续和的int main(){    //freopen("in.txt","r",stdin);    int n;    while(cin>>n)    {        if(n==0)    break;        bool flag;    flag=0;        for(int i=1;i<=n;i++)        {            cin>>a[i];            if(a[i]>=0)                flag=1;//判断是否为全负;        }        if(flag)//不为全负;        {            f[1]=a[1];            s[1]=1;            for(int i=2;i<=n;i++)            {                if(f[i-1]+a[i]>=a[i])//也就是说加上a[i]会更大                {                    f[i]=f[i-1]+a[i];                    s[i]=s[i-1];//起始点不变.                }                else                {                    f[i]=a[i];                    s[i]=i;//也就是重新开始.                }            }            //这里记录完成,找到以a[i]结尾的最大连续子序列和.下面开始寻找最大,和路径.                        //for(int i=1;i<=n;i++)            //cout<<f[i]<<" ";//以i为结尾的最大连续子序列         //  cout<<endl;                        int max=f[1];            int st=1;            int end=1;            for(int i=2;i<=n;i++)            {                if(f[i]>max)                {                    max=f[i];                    st=s[i];//st[i]是记录的最大和的开始.                    end=i;                }            }            cout<<max<<" "<<a[st]<<" "<<a[end]<<endl;        }        else            cout<<"0 "<<a[1]<<" "<<a[n]<<endl;            }}




0 0
原创粉丝点击