#125. 动态规划【NOIP2015】双子序列最大和

动态规划【NOIP2015】双子序列最大和

1. 【NOIP2015】双子序列最大和

给定一个长度为n的整数序列,要求从中选出两个连续子序列,使得这两个连续子序列的序列和之和最大,最终只需输出这个最大和。一个连续子序列的序列和为该连续子序列中所有数之和。要求:每个连续子序列长度至少为1,且两个连续子序列之间至少间隔1个数。

补全程序:

#include<iostream>
using namespace std;
const int MAXN=1000;
int n,i,ans,sum;
int x[MAXN];
int lmax[MAXN];
int rmax[MAXN];

int main() {
    cin>>n;
    for (i=0;i<n;i++) cin>>x[i];
    lmax[0]=x[0];
    for (i=1;i<n;i++)
        if (lmax[i-1]<=0)
            lmax[i]=x[i];
        else
            lmax[i]=lmax[i-1]+x[i];
    for (i=1;i<n;i++)
        if (lmax[i]<lmax[i-1]) lmax[i]=lmax[i-1];
    ① ;
    for (i=n-2;i>=0;i--)
        if (rmax[i+1]<=0)
            ② ;
        else
            ③ ;
    for (i=n-2;i>=0;i--)
        if (rmax[i]<rmax[i+1])
            ④ ;
    ans=x[0]+x[2];
    for (i=1;i<n-1;i++) {
        sum= ⑤ ;
        if (sum>ans) ans=sum;
    }
    cout<<ans<<endl;
    return 0;
}

选择题:

  1. ①处应填( )
    {{ select(1) }}
  • lmax[n-1]=x[n-1]
  • rmax[n]=x[n]
  • rmax[n-1]=x[n-1]
  • lmax[n]=x[n]
  1. ②处应填( )
    {{ select(2) }}
  • rmax[i]=x[i+1]
  • rmax[i]=x[i]
  • x[i]=rmax[i]
  • rmax[i]=x[i-1]
  1. ③处应填( )
    {{ select(3) }}
  • rmax[i]=rmax[i-1]+x[i]
  • rmax[i]=0x3f
  • rmax[i-1]=rmax[i]+x[i]
  • rmax[i]=rmax[i+1]+x[i]
  1. ④处应填( )
    {{ select(4) }}
  • rmax[i]=rmax[i+1]
  • rmax[i]=rmax[i-1]
  • rmax[i]=x[i+1]
  • rmax[i]=x[i-1]
  1. ⑤处应填( )
    {{ select(5) }}
  • lmax[i]+rmax[i]
  • lmax[i-1]+rmax[i+1]
  • lmax[i-2]+rmax[i+1]
  • lmax[i-2]+rmax[i+2]