제출 #1131748

#제출 시각아이디문제언어결과실행 시간메모리
1131748ttamxTortoise (CEOI21_tortoise)C++20
48 / 100
152 ms217940 KiB
#include<bits/stdc++.h> using namespace std; using ll = long long; const int N=305; const int INF=INT_MAX/2; int n; int a[N]; int dp[N][N][2*N]; int aux[2*N]; vector<int> playground; ll tot; int main(){ cin.tie(nullptr)->sync_with_stdio(false); cin >> n; for(int i=1;i<=n;i++){ cin >> a[i]; if(a[i]==-1){ playground.emplace_back(i); }else{ tot+=a[i]; } } for(int i=0;i<=n;i++){ for(int j=0;j<=n;j++){ for(int k=0;k<=2*n;k++){ dp[i][j][k]=-INF; } } } int ans=0; dp[1][1][2]=(a[1]>0?1:0); for(int i=2;i<=n;i++){ for(int j=1;j<=n;j++){ for(int k=0;k<=2*(i-1);k++){ dp[i][j][k]=max(dp[i][j][k],dp[i-1][j][k]); } } if(a[i]<1)continue; for(int j=0;j<=2*i;j++){ aux[j]=-INF; } aux[i+1]=1; for(int j=1;j<=n;j++){ int move=INF; for(auto x:playground){ move=min(move,abs(j-x)+abs(i-x)); } for(int k=0;k<=2*(i-1)&&k+move<=2*i;k++){ aux[k+move]=max(aux[k+move],dp[i-1][j][k]+1); } } int d=INF; for(auto x:playground){ d=min(d,abs(i-x)); } int mx=-1; for(int st=0;st<=2*i;st++){ if(aux[st]<=mx)continue; mx=aux[st]; for(int c=0,j=st;c<a[i]&&j<=2*i;c++,j+=2*d){ dp[i][i][j]=max(dp[i][i][j],mx+c); } } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ for(int k=0;k<=2*i;k++){ ans=max(ans,dp[i][j][k]); } } } cout << tot-ans << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...