POJ 2593最大子序列
http://poj.org/problem?id=2593
题意分析:本题是要求两个子序列的和最大,所以设数组l[100010],l[i]表示从左到右0到i的子序列的最大和,然后从右向左找到i+1到n-1中最大的和,然后相加l[i],遍历一般就能的到最大值。而两步中先从左到右,后又从右到左,用的都是上一篇最大子序列中的简单法子,没用动态规划。
AC代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> using namespace std; int l[100010]; int a[100010]; int main() { int n; while(scanf("%d",&n)!=EOF&&n) { for(int i=0;i<n;i++) { scanf("%d",&a[i]); } int sum=0; int maxn=-0x7fffffff; for(int i=0;i<n;i++) { sum=sum+a[i]; if(sum>maxn) maxn=sum; if(sum<0) sum=0; l[i]=maxn; } maxn=-0x7fffffff; sum=0; int summ=-0x7fffffff; for(int i=n-1;i>=1;i--) { sum=sum+a[i]; if(sum>maxn) maxn=sum; if(sum<0) sum=0; if(summ<maxn+l[i-1]) summ=maxn+l[i-1]; } printf("%d\n",summ); } return 0; }

浙公网安备 33010602011771号