以LG-P1115为例
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int N = 200010;
int n;
int a[N], b[N];
int ans = -0x3f3f3f3f;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i ++ )
{
cin >> a[i];
if (i == 1) b[i] = a[i];
else b[i] = max(a[i], b[i - 1] + a[i]);
ans = max(ans, b[i]);
}
cout << ans << '\n';
}
想法:
最大字段和问题,答案一定可以由所有数组从最左删除一部分,再从最右删除一部分得出。即左边删除的部分小于0,右端删除的部分也小于0,b[i]可以视作左部为正的前缀和,保证b[i]大于0即可,再通过枚举右端点更新ans,可以保证右端部分也大于0
相同想法就可以理解 CF1692H Gambling 的思路