题目:
求一个序列中最大的两段不连续子串之和。
很明显,这道题是用动态规划 来解答,主要是 列出状态转移方程
tm[i]代表第i个数结尾的最大子串
sm[i]代表第i个数开头的最大子串
stm[i]代表后面n-i+1个元素的最大值
#include<iostream>
using namespace std;
#define MAX 100001
#define max(a,b) a>b?a:b
int a[MAX],tm[MAX],sm[MAX],stm[MAX];
int main(){
int num,i;
scanf("%d",&num);
while(num!=0){
for(i=1;i<=num;i++){
scanf("%d",&a[i]);
}
tm[1] = a[1];
sm[num] = a[num];
stm[num] = a[num];
for(i=2;i<=num;i++)
tm[i] = max(a[i],a[i]+tm[i-1]);
for(i=num-1;i>=1;i--)
sm[i] = max(a[i],a[i]+sm[i+1]);
for(i=num-1;i>=1;i--)
stm[i] = max(stm[i+1],sm[i]);
int sum = tm[1]+stm[2];
for(i=2;i<num;i++)
sum = max(sum,tm[i]+stm[i+1]);
printf("%d\n",sum);
scanf("%d",&num);
}
return 0;
}