PAT A1007 Maximum Subsequence Sum
思路:利用一维dp数组,dp[i]代表以a[i]为结尾的子序列的最大值,并且使用s[i]记录子序列第一个值的下标。 状态转移方程为 dp[i] = max(dp[i-1] + a[i], a[i])
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN = 10005;
int dp[MAXN], a[MAXN], s[MAXN];
int K;
int main() {
scanf("%d", &K);
bool flag = false;
for(int i = 0; i < K; i++) {
scanf("%d", &a[i]);
if(a[i] >= 0) flag = true;
}
if(!flag) {
printf("0 %d %d", a[0], a[K - 1]);
return 0;
}
dp[0] = a[0];
for(int i = 1; i < K; i++) {
if(dp[i - 1] + a[i] > a[i]) {
dp[i] = dp[i - 1] + a[i];
s[i] = s[i-1];
} else {
dp[i] = a[i];
s[i] = i;
}
}
int res = 0;
for(int i = 1; i < K; i++)
if(dp[i] > dp[res])
res = i;
printf("%d %d %d", dp[res], a[s[res]], a[res]);
return 0;
}