动态规划 HDU-1003 Max Sum
题目链接:杭电1003
题目大意:求连续子序列最大和
解题思路:设置当前和及最大和(最大和设为1号元素 防止全负数) 从1位置往下加 只要大于最大和就改变最大和并记录坐标 只要当前和为负数就使当前和为0(因为当前和为负数 往下一位加那个和一定比下一位小 还不如直接一下一项为子列的首项)最后遍历完得到的坐标即为右坐标 再从右坐标开始向左遍历求的左坐标
代码块:
#include<iostream>
#include<cstdio>
using namespace std;
int main() {
int t;
cin >> t;
for (int k = 1; k <= t; k++) {
int arr[100009] = { 0 };
int n;
int thisSum = 0, maxSum = 0;
int maxIndex = 1, minIndex = 0;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> arr[i];
}
maxSum = arr[1];
for (int i = 1; i <= n; i++) {
thisSum += arr[i];
if (thisSum > maxSum) {
maxSum = thisSum;
maxIndex = i;
}
if (thisSum < 0) {
thisSum = 0;
}
}
thisSum = 0;
for (int i = maxIndex; i >= 1; i--) {
thisSum += arr[i];
if (maxSum == thisSum) {
minIndex = i;
}
}
printf("Case %d:\n", k);
if (k != t) {
printf("%d %d %d\n\n", maxSum, minIndex, maxIndex);
}
else {
printf("%d %d %d\n", maxSum, minIndex, maxIndex);
}
}
return 0;
}