Maximum sum(找到互補相交的兩個子序列使之和最大)

題目來源:[NWPU][2014][TRN][6]動態規劃第一講——簡單線性dp  G 題

http://vjudge.net/contest/view.action?cid=49759#problem/G

作者:npufz

題目:給定一列數,找出兩個不相交的子序列,使它們的和值最大

代碼:

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
    int t,num,i,sum1[50003],sum2[50003],fj;
    long long int m1,m2,m;
    cin>>t;
    while(t--)
    {
        scanf("%d",&num);
        for(i=0;i<num;i++)
           {
              scanf("%d",&sum1[i]);
              sum2[i]=sum1[i];
           }
        for(i=1;i<num;i++)
            if(sum1[i-1]>0) sum1[i]+=sum1[i-1];
        for(i=num-2;i>=0;i--)
             if(sum2[i+1]>0)  sum2[i]+=sum2[i+1];
             //cout<<"ok"<<endl;
        m1=sum1[0];
        m=-2000000000000; m2=-2000000000;
        for(i=0;i<num;i++)
                if(m2<sum2[i]) m2=sum2[i];
        for(fj=0;fj<num-1;fj++)
        {
            if(sum1[fj]>m1) m1=sum1[fj];
            if(sum2[fj]==m2)
            {   m2=-2000000000;
                for(i=fj+1;i<num;i++)
                    if(sum2[i]>m2) m2=sum2[i];
            }
         if((m1+m2)>m) m=m1+m2;
         }
        cout<<m<<endl;
 }
return 0;
}

反思:一開始對數據的處理上和尋找兩個最大子序列上操作重複較多,就TLE了,後來用一個分界值分開給定的數列後改成並不是每次都找出分好的兩個小序列的最大子序列而            是根據上次找的情況來判斷要不要找,這樣就A了


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章