P1725 琪露诺
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N = 2e6 + 10;
vector<int>dp(N);
vector<int>a(N);
int main() {
int n, l, r; cin >> n >> l >> r;
for(int i = 0; i <= n; i++) cin >> a[i];
for(int i = n ; i >= n - l ; i -- ) dp[i] = a[i] ;
deque<int> q;
q.push_back(n + 1);
for(int i = n ; i >= l ; i-- ){//从i-l跳到[i,i-l+r]
while(q.size() && dp[q.back()] <= dp[i])q.pop_back() ;
q.push_back(i) ;
while(q.size() && q.front() > i - l + r)q.pop_front() ;
dp[i - l] = dp[q.front()] + a[i - l] ;
}
//最开始思路是
//dp[i] = max[dp[i - L, i - R]] + a[i]
//dp[n] = max[dp[n - L, n]] + a[n]
//反推的话更轻松一些
cout << dp[0] << '\n';
return 0;
}