码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 2479 Maximum sum

时间:2017-02-09 23:52:52      阅读:361      评论:0      收藏:0      [点我收藏+]

标签:max   div   scanf   namespace   std   tar   strong   get   sum   

http://poj.org/problem?id=2479

题意:

给出一个整数串,求连续子串1和连续子串2,不相交并且串1加串2的和最大。

 

思路:

其实就是求最大连续和,题意要求就是求两段最大连续和。我们可以从左边和右边分别求最大连续和,代码中的dp_l[i]就是1~i的最大连续和,dp_r[i]则是i~n的最大连续和

 1 #include<iostream> 
 2 #include<string>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 const int maxn = 50000 + 5;
 8 const int INF = -10000000;
 9 
10 int n;
11 int a[maxn];
12 int l[maxn], r[maxn];
13 int dp_l[maxn], dp_r[maxn];
14 
15 int main()
16 {
17     //freopen("D:\\txt.txt", "r", stdin);
18     int T;
19     scanf("%d", &T);
20     while (T--)
21     {
22         scanf("%d", &n);
23         for (int i = 1; i <= n; i++)
24             scanf("%d", &a[i]);
25         l[0] = dp_l[0] = INF;
26         r[n+1] = dp_r[n+1]=  INF;
27         for (int i = 1; i <= n; i++)
28         {
29             l[i] = max(l[i - 1] + a[i], a[i]);
30             dp_l[i] = max(dp_l[i - 1], l[i]);
31         }
32         for (int i = n; i >= 1; i--)
33         {
34             r[i] = max(r[i + 1] + a[i], a[i]);
35             dp_r[i] = max(dp_r[i + 1], r[i]);
36         }
37         int ans = INF;
38         for (int i = 1; i <= n; i++)
39         {
40             ans = max(dp_l[i] + dp_r[i + 1], ans);
41         }
42         printf("%d\n", ans);
43     }
44     return 0;
45 }

 

POJ 2479 Maximum sum

标签:max   div   scanf   namespace   std   tar   strong   get   sum   

原文地址:http://www.cnblogs.com/zyb993963526/p/6384448.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!