最大子串和(HDOJ1003)
一 最大子串和
最大子串和是一道经典的动态规划问题。具体问题是指,在一串连续的数字中,找到一个最大的字串,它们的和在所有的子串中最大,
比如序列,6,-1,5,4,-7,它的连续最大段子串和就是:6 + (-1) + 5 + 4 = 14.
假设a[]为原始数据串。定义dp[i]为:以a[i]为结尾的最大子串和。
那么显然:
递推式为:dp[i] = max{dp[i-1] + a[i] , a[i]}
二 源码
1 #include <iostream>
2 using namespace std;
3
4 int a[100000];
5
6 int main()
7 {
8 int t;
9 cin >> t;
10 int i,j;
11 for (j = 0; j < t; j++)
12 {
13 int n;
14 cin >> n;
15 for (i = 0; i < n; i++)
16 cin >> a[i];
17 int s = 0,e = 0;
18 int start = 0;
19 int max = -100000000;
20 int tmp = 0;
21 for (i = 0; i < n; i++)
22 {
23 tmp += a[i];
24 if (tmp > max)
25 {
26 max = tmp;
27 s = start;
28 e = i;
29 }
30 if (tmp < 0)
31 {
32 start = i + 1;
33 tmp = 0;
34 }
35 }
36 cout << "Case " << j + 1 << ":" << endl;
37 cout << max << " " << s + 1 << " " << e + 1<< endl;
38 if (j != t - 1)
39 cout << endl;
40 }
41 return 0;
42 }
浙公网安备 33010602011771号