HDOJ 1003 (最大连续子区间和)

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 }

 

posted on 2019-02-27 19:44  QingFengDaHui  阅读(133)  评论(0编辑  收藏  举报

导航