poj 2479 (最大子串和的变形)

首先front[i]是以第i个元素开头的最大子串和,back[i]是以第i个元素结尾的最大子串和,front_m[i]是从第i个元素到最后一个元素这段中最大子串和,然后ans=max(ans,back[i]+front_m[i+1])

 1 #include<iostream>
 2 #include<string.h>
 3 #include<string>
 4 #include<sstream>
 5 #include<vector>
 6 #include<deque>
 7 #include<map>
 8 #include<algorithm>
 9 #include<iomanip>
10 #include<math.h>
11 #include<set>
12 using namespace std;
13 
14 int maxn = 0x3f3f3f3f3f;
15 typedef long long ll;
16 typedef unsigned long long ull;
17 
18 int in[50005];
19 int front[50005], back[50005], front_m[50005];
20 int main()
21 {
22     int t, n;
23     cin >> t;
24     while (t--)
25     {
26         cin >> n;
27         for (int i = 1; i <=n; i++)
28         {
29             scanf_s("%d", &in[i]);
30         }
31         front[n] = in[n];
32         for (int i = n - 1; i > 0; i--)
33         {
34             front[i] = front[i + 1] > 0 ? in[i] + front[i + 1] : in[i];
35         }
36         back[1] = in[1];
37         for (int i = 2; i <= n; i++)
38         {
39             back[i] = back[i - 1] > 0 ? back[i - 1] + in[i] : in[i];
40         }
41         front_m[n] = front[n];
42         for (int i = n - 1; i > 0; i--)
43             front_m[i] = max(front_m[i + 1], front[i]);    
44         int ans=-maxn;
45         for (int i = 1; i < n; i++)
46             ans = max(back[i] + front_m[i + 1], ans);
47         cout << ans << endl;
48     }
49     return 0;
50 }

 

posted on 2019-03-04 17:46  QingFengDaHui  阅读(167)  评论(0编辑  收藏  举报

导航