传送门
首先,在-1的位置上的数不会减少
假设有i
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#define N 10005
using namespace std;
int a[N],b[N],big[N][105],g[N][105],f[N][105],sma[N][105];
int n,k,tot,ans;
int main(){
scanf("%d%d",&n,&k);
for (int i=1;i<=n;i++){
scanf("%d",&a[i]);
if (a[i]==-1){
tot++;
b[tot]=i;
}
}
for (int i=1;i<=n;i++)
for (int j=1;j<=k;j++) big[i][j]=big[i-1][j]+(a[i]>j);
for (int i=n;i>=1;i--)
for (int j=1;j<=k;j++) sma[i][j]=sma[i+1][j]+(a[i]<j&&a[i]!=-1);
for (int i=1;i<=tot;i++){
f[i][1]=g[i][1]=f[i-1][1]+big[b[i]][1]+sma[b[i]][1];
for (int j=2;j<=k;j++){
f[i][j]=g[i-1][j]+big[b[i]][j]+sma[b[i]][j];
g[i][j]=min(g[i][j-1],f[i][j]);
}
}
ans=g[tot][k];
for (int i=1;i<=n;i++) ans+=big[i][a[i]];
printf("%d",ans);
}