Link:
A:
$dp[i][j][k]$表示前$i$个中有$j$个0且末位为$k$的最优解
状态数$O(n^3)$
#include <bits/stdc++.h> using namespace std; #define X first #define Y second typedef long long ll; typedef pair<int,int> P; const int MAXN=105,INF=1<<30; int n,dat[MAXN],dp[MAXN][MAXN][MAXN]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&dat[i]); for(int i=0;i<MAXN;i++) for(int j=0;j<MAXN;j++) for(int k=0;k<MAXN;k++) dp[i][j][k]=INF; if(dat[1]!=0) dp[1][1][0]=1; else dp[1][1][0]=0; for(int i=1;i<n;i++) for(int j=1;j<=i;j++) for(int k=0;k<=i-j;k++) if(dp[i][j][k]!=INF) { dp[i+1][j][k+1]=min(dp[i+1][j][k+1],dp[i][j][k]+(dat[i+1]!=k+1)); dp[i+1][j+1][0]=min(dp[i+1][j+1][0],dp[i][j][k]+(dat[i+1]!=0)); } for(int i=1;i<=n;i++) { int res=INF; for(int j=0;j<=n;j++) res=min(res,dp[n][i][j]); printf("%d\n",res); } return 0; }