トピックリンク:http://acm.hdu.edu.cn/showproblem.php?pid=1003
影響を受ける:
最大フィールドのシーケンスを解決し、開始および終了座標が一番その最大サブセグメントとなっています。
問題解決のアイデア:
定義された状態\(F [i]が\)である([I] \)\フィールドの終わりと最大で、状態遷移方程式があります。
\ [F [I] = \ MAX(0、F [I-1])+ [I] \]
定義された状態を同時に\(S [I] \)で表される([I] \)\要素の左端のX座標最大フィールドで存在します。
- 当\(F [i]が\ LT 0 \)时、\(S [I] = I \) 。
- 当 \(f[i] \ge 0\) 时,\(s[i] = s[i-1]\)
次のようにコードは次のとおりです。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
int T, n, a[maxn], f[maxn], anss, anst, s[maxn], ans;
int main() {
scanf("%d", &T);
for (int cas = 1; cas <= T; cas ++) {
if (cas > 1) puts("");
scanf("%d", &n);
for (int i = 1; i <= n; i ++) scanf("%d", a+i);
ans = f[1] = a[1];
anss = anst = s[1] = 1;
for (int i = 2; i <= n; i ++) {
if (f[i-1] >= 0) {
f[i] = f[i-1] + a[i];
s[i] = s[i-1];
}
else {
f[i] = a[i];
s[i] = i;
}
if (f[i] > ans) {
ans = f[i];
anss = s[i];
anst = i;
}
}
printf("Case %d:\n", cas);
printf("%d %d %d\n", ans, anss, anst);
}
return 0;
}