제출 #883723

#제출 시각아이디문제언어결과실행 시간메모리
883723alexddK개의 묶음 (IZhO14_blocks)C++17
0 / 100
1 ms2500 KiB
#include<iostream> #include<deque> using namespace std; const int INF = 1e9; int n,k; int a[100005]; int tole[100005]; int tori[100005]; int dp[100005][105]; signed main() { cin>>n>>k; deque<int> dq; int mxm=0; for(int i=1;i<=n;i++) { cin>>a[i]; mxm = max(mxm,a[i]); while(!dq.empty() && a[dq.back()]<=a[i]) dq.pop_back(); if(dq.empty()) tole[i]=0; else tole[i]=dq.back(); dq.push_back(i); for(int j=1;j<=k;j++) dp[i][j]=INF; dp[i][1] = mxm; } dq.clear(); for(int i=n;i>0;i--) { while(!dq.empty() && a[dq.back()]<=a[i]) dq.pop_back(); if(dq.empty()) tori[i]=n+1; else tori[i]=dq.back(); dq.push_back(i); } for(int i=1;i<=k;i++) dp[0][i]=INF; for(int i=1;i<=n;i++) { //cout<<i<<" "<<tole[i]<<" "<<tori[i]<<" zzz\n"; for(int j=2;j<=k;j++) { //if(dp[tole[i]][j-1]==INF) // continue; //cout<<i<<" "<<j<<" zzz\n"; // dp[tori[i]-1][j] = min(dp[tori[i]-1][j], dp[tole[i]][j-1] + a[i]); int aux = INF; for(int x=tole[i];x<i;x++) aux = min(aux, dp[x][j-1]); dp[i][j] = min(dp[i][j], aux + a[i]); dp[tori[i]-1][j] = min(dp[tori[i]-1][j], aux + a[i]); } } cout<<dp[n][k]; return 0; } /** 10 5 1 9 1 9 1 9 1 9 1 9 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...