今晚把自己的编辑器给折腾了一下,耽误了不少时间,依旧是按照网上大神给出的线路一点一点的练习。
这道题目还是水,状态转移方程是dp[i] = max(dp[i-1]+a[i],a[i])得到结果之后再搜索一遍就好,这道题目还要求求出其实位置,末尾位置其实已经知道了,在求其实位置的过程中我采用了遍历的方法。
题目链接:https://vjudge.net/problem/HDU-1003
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 100005;
int dp[maxn];
int a[maxn];
int n;
int ncase , cnt = 1;
void solve () {
int start , end;
int ans = -inf;
dp[1] = a[1];
for (int i = 2 ; i <= n ; i++) {
dp[i] = max(dp[i-1]+a[i] , a[i]);
}
for (int i = 1 ; i <= n ; i++)
if (ans < dp[i]) {
ans = dp[i];
end = i;
}
int tmp = 0;
for (int i = end ; i >= 1 ; i--) {
tmp += a[i];
if (tmp == ans) start = i;
}
printf("Case %d:\n", cnt++);
printf("%d %d %d\n", ans , start , end);
}
int main () {
scanf("%d" , &ncase);
while (ncase--) {
memset(dp,0,sizeof(dp));
memset(a,0,sizeof(a));
scanf("%d" , &n);
for (int i = 1 ; i <= n ; i++)
scanf("%d" , &a[i]);
solve();
if(ncase) printf("\n");
}
}