原題鏈接 http://acm.hdu.edu.cn/showproblem.php?pid=1003
Max Sum
Source Code
/**
* 動態規劃:計算最大子段和
* 算法描述:
* 數組a[]有n個元素, 記 s[i] 爲從a[0]到a[i]中,((包含a[i]))的最大子段和 s[i] = max(s[i - 1] + a[i], a[i]),
然後在s[0]到s[i]裏找出最大值就是a[]的最大子段和
* 即: s[i] 的值爲: s[i-1]>0時,s[i] = s[i - 1]+a[i];
* 否則 s[i] = a[i]
*/
#include <iostream>
using namespace std;
//記錄最大子段和的起點,終點,值
int start, end, MaxValue;
void MaxSum(int *array, int len) {
int i, newStart = 0;
int sum = 0;
for (i = 0; i < len; i++) {
if (sum < 0) {
sum = array[i];
newStart = i;
} else {
sum += array[i];
}
if (sum > MaxValue) {
MaxValue = sum;
start = newStart;
end = i;
}
}
}
int main() {
int cases, len, i, j;
int num[100001];
while (scanf("%d", &cases) != EOF) {
for (j = 1; j <= cases; j++) {
scanf("%d", &len);
for(i = 0; i < len; i++) {
scanf("%d", &num[i]);
}
MaxValue = num[0];
start = end = 0;
MaxSum(num, len);
printf("Case %d:\n", j);
printf("%d %d %d\n", MaxValue, start + 1, end + 1);
if (j != cases) printf("\n");
}
}
}