最大连续子序列和


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;
		}
		else
			cout<<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;
        
    }
}





发布了65 篇原创文章 · 获赞 3 · 访问量 2万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章