#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N=5005;
const int INF=INT_MAX/2;
int n;
int a[N];
int dp[N][2*N];
int aux[2*N];
int r[N],l[N];
bool mark[N];
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){
mark[i]=true;
}else{
tot+=a[i];
}
}
l[0]=-1e7,r[n+1]=1e7;
for(int i=1;i<=n;i++){
l[i]=mark[i]?i:l[i-1];
}
for(int i=n;i>=1;i--){
r[i]=mark[i]?i:r[i+1];
}
for(int i=0;i<=n;i++){
for(int j=0;j<=2*n;j++){
dp[i][j]=-INF;
}
}
int ans=0;
dp[1][2]=(a[1]>0?1:0);
for(int i=2;i<=n;i++){
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 p:{l[i],r[i],l[j],r[j]}){
move=min(move,abs(i-p)+abs(j-p));
}
for(int k=0;k<=2*(i-1)&&k+move<=2*i;k++){
aux[k+move]=max(aux[k+move],dp[j][k]+1);
}
}
int d=min(i-l[i],r[i]-i);
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][j]=max(dp[i][j],mx+c);
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=2*i;j++){
ans=max(ans,dp[i][j]);
}
}
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... |