poj2593
题目链接:http://poj.org/problem?id=2593
动态规划
大意:给你一个数列,求数列中两个不重叠的子序列的最大和。
从左向右求得left[]数组,left[i]表示0~i之间的最大连续子序列。
再从右往做左求最大子序列,然后求0~i,i+1~n-1的两段子序列中的最大和。
1 1 #include <stdio.h> 2 2 int main() 3 3 { 4 4 int left[100005]; 5 5 int right[100005]; 6 6 int a[100005]; 7 7 8 8 while(1) 9 9 { 10 10 int n,i; 11 11 scanf("%d",&n); 12 12 if(n==0) break; 13 13 for(i=0;i<n;i++) 14 14 { 15 15 scanf("%d",&a[i]); 16 16 } 17 17 int sumL=0; 18 18 int max=-99999999; 19 19 for(i=0;i<n;i++)//从左向右求到i结尾的最大连续子串的最大值 //如果这个循环看不懂的话,可以先做下hdu1003 20 20 { 21 21 sumL=sumL+a[i]; 22 22 if(sumL>max) 23 23 { 24 24 max=sumL; 25 25 } 26 26 if(sumL<0) 27 27 { 28 28 sumL=0; 29 29 } 30 30 left[i]=max; 31 31 } 32 32 max=-99999999; 33 33 int tmp=-99999999; 34 34 int sumR=0; 35 35 for(i=n-1;i>=1;i--) 36 36 { 37 37 sumR=sumR+a[i]; 38 38 if(sumR>max) 39 39 { 40 40 max=sumR; 41 41 42 42 } 43 43 if(sumR<0) 44 44 { 45 45 sumR=0; 46 46 } 47 47 if(tmp<max+left[i-1]) 48 48 { 49 49 tmp=max+left[i-1]; 50 50 } 51 51 } 52 52 //cout<<max<<endl; 53 53 printf("%d\n",tmp); 54 54 } 55 55 return 0; 56 56 }