最大連續子序列和


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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章