題目來源:[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了