题目要求输入的是第一个数和最后一个数,而不是他们的序号。
用动态规划来求解最大值,转移态方程:dp[i]=max{arr[i],dp[i-1]+arr[i]}
利用一个start数组来解决起点的问题
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int arr[maxn],dp[maxn],start[maxn];
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
dp[0] = arr[0];
start[0] = 0;
for (int i = 1; i < n; i++) {
if (dp[i - 1] + arr[i] < arr[i]) { //连续值的最大和小于单个值,更新start
start[i] = i;
dp[i] = arr[i];
}
else {
dp[i] = dp[i - 1] + arr[i];
start[i] = start[i - 1];
}
}
int index = 0, sum = -pow(2, 30); //index为最大值的下标
for (int i = 0; i < n; i++) {
if (sum < dp[i]) {
sum = dp[i];
index = i;
}
}
if (sum >= 0)
printf("%d %d %d", sum, arr[start[index]], arr[index]);
else
printf("0 %d %d", arr[0],arr[n-1]);
return 0;
}