题目来源:[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了