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了


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值