#CS50701. 完善程序7-动态规划-1双子序列最大和
完善程序7-动态规划-1双子序列最大和
(双子序列最大和)
给定一个长度为 n(3≤n≤1000) 的整数序列,要求从中选出两个连续子序列,使得这两个连续子序列的序列和之和最大,最终只需输出这个最大和。一个连续子序列的序列和为该连续子序列中所有数之和。要求:每个连续子序列长度至少为 1,且两个连续子序列之间至少间隔 1 个数。(第五空 4 分,其余 2.5 分)
#include <iostream>
using namespace std;
const int MAXN = 1000;
int n, i, ans, sum;
int x[MAXN];
int lmax[MAXN]; // lmax[i]为仅含 x[i]及 x[i]左侧整数的连续子序列的序列和中,最大的序列和
int rmax[MAXN]; // rmax[i]为仅含 x[i]及 x[i]右侧整数的连续子序列的序列和中,最大的序列和
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];
(1) ;
for (i = n - 2; i >= 0; i--)
if (rmax[i + 1] <= 0)
(2) ;
else
(3) ;
for (i = n - 2; i >= 0; i--)
if (rmax[i] < rmax[i + 1])
(4) ;
ans = x[0] + x[2];
for (i = 1; i < n - 1; i++) {
sum = (5) ;
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]