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 }

posted on 2012-08-06 21:24  矮人狙击手!  阅读(973)  评论(0编辑  收藏  举报

导航