cf1359D Yet Another Yet Another Task - DP
阿新 • • 發佈:2020-11-06
傳送門
給出一個序列,最大化區間和減去該區間的最大值
首先,如果是對於負數的情況,答案肯定是0
那麼只需要知道正數的情況即可
列舉最大值,然後進行查詢就行了,套最大連續子序列和
如果說存在a[i] > mx,就相當於這一段區間的最大值不是這個,就重新計算區間和
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; const int N = 2e5 + 5; int a[N]; int main(){ int n; scanf("%d", &n); for(int i = 1; i <= n; i++) scanf("%d", &a[i]); int ans = 0; for(int mx = 0; mx <= 30; mx++) { int pre = 0; int cur = 0; for(int i = 1; i <= n; i++) { if(a[i] > mx) { pre = 0; cur = 0; }else { cur = max(pre, 0) + a[i]; pre = cur; ans = max(ans, cur - mx); } } } printf("%d\n", ans); return 0; }
垃圾dp選手永遠想不到的東西