#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[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;
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*n;k++){
ans=max(ans,dp[i][j][k]);
}
}
}
cout << tot-ans << "\n";
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |