#10778. 动态规划【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;
}
选择题:
- ①处应填( )
{{ select(1) }}
- lmax[n-1]=x[n-1]
- rmax[n]=x[n]
- rmax[n-1]=x[n-1]
- lmax[n]=x[n]
- ②处应填( )
{{ select(2) }}
- rmax[i]=x[i+1]
- rmax[i]=x[i]
- x[i]=rmax[i]
- rmax[i]=x[i-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]
- ④处应填( )
{{ select(4) }}
- rmax[i]=rmax[i+1]
- rmax[i]=rmax[i-1]
- rmax[i]=x[i+1]
- rmax[i]=x[i-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]