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) 编辑 收藏 举报