dp[i]表示以in[i]结尾的最大子区间和,则dp[i]=max(0,dp[i-1])+in[i];然后比较dp[1...n]找到最大值
这道题的难点在于找到首尾的位置
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 typedef long long ll; 15 typedef unsigned long long ull; 16 17 int dp[100005]; 18 int in[100005]; 19 int main() 20 { 21 int t, n, cas = 1; 22 cin >> t; 23 while (t--) 24 { 25 if (cas != 1) 26 cout << endl; 27 cin >> n; 28 for (int i = 1; i <= n; i++) 29 { 30 cin >> in[i]; 31 } 32 dp[1] = in[1]; 33 int maxsum = dp[1]; 34 int s = 1, e = 1, x=1; 35 for (int i = 2; i <= n; i++) 36 { 37 if (dp[i - 1] >= 0) 38 dp[i] = dp[i - 1] + in[i]; 39 else 40 { 41 dp[i] = in[i]; 42 x = i; 43 } 44 if (maxsum < dp[i]) 45 { 46 maxsum = dp[i]; 47 e = i; 48 s = x; 49 } 50 } 51 cout << "Case " << cas++ << ":" << endl; 52 cout << maxsum << " " << s << " " << e << endl; 53 } 54 return 0; 55 }