Link:

USACO 2018 Feb Gold 传送门

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;
}
Problem A

相关文章: