結果
問題 |
No.1117 数列分割
|
ユーザー |
👑 ![]() |
提出日時 | 2021-01-04 15:46:10 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,833 ms / 3,000 ms |
コード長 | 947 bytes |
コンパイル時間 | 2,253 ms |
コンパイル使用メモリ | 207,396 KB |
最終ジャッジ日時 | 2025-01-17 09:36:34 |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 26 |
ソースコード
#include<bits/stdc++.h> using namespace std; using LL=long long; using ULL=unsigned long long; #define rep(i,n) for(int i=0; i<(n); i++) const LL INF=1000000000000000; int N,K,M; LL A[3001][2]; LL dp[3001][3001][2]; deque<int> dpw[3001][2]; int main(){ cin>>N>>K>>M; rep(i,N) cin>>A[i][0]; A[N][0]=0; for(int i=N-1; i>=0; i--) A[i][0]+=A[i+1][0]; rep(i,N+1) A[i][1]=-A[i][0]; rep(t,2) rep(i,N+1) rep(k,K+1) dp[k][i][t]=-INF; rep(t,2) dp[0][0][t]=A[0][t]; rep(t,2) rep(k,K+1) dpw[k][t]={0}; rep(i,N) rep(k,K){ LL tmp = -INF; rep(t,2){ if(dpw[k][t].size()) if(dpw[k][t].front()<=i-M) dpw[k][t].pop_front(); if(dpw[k][t].size()) tmp=max(tmp,dp[k][dpw[k][t].front()][t]-A[i+1][t]); } rep(t,2){ dp[k+1][i+1][t]=tmp+A[i+1][t]; while(dpw[k+1][t].size()) if(dp[k+1][dpw[k+1][t].back()][t]<=dp[k+1][i+1][t]) dpw[k+1][t].pop_back(); else break; dpw[k+1][t].push_back(i+1); } } cout<<dp[K][N][0]<<endl; return 0; }