1. 程式人生 > >bzoj 5196: [Usaco2018 Feb]Taming the Herd (dp)

bzoj 5196: [Usaco2018 Feb]Taming the Herd (dp)

Solution f[i][j] 表示前 i 天經歷出逃了 j 次,且第 i+1 天進行了出逃 f[i][j]=min(f[k][j1]+count(k+1,i)) 其中 count(x,y) 表示 axay1,2yx+1 的差別數 這樣我們可以得到 n4 的暴力 但是我們可以預處理出來這個 countcnt[i][j] 表示 aiaj0,1ji 然後就可以得到一個

n3 的dp

Code

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 1010
#define inf 0x3f3f3f3f
int n,a[N],cnt[N][N],f[N][N];
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    //i-j與0..j-i 
    for(int i=1;i<=n;i++){
        for
(int j=i;j<=n;j++){ for(int k=0;k<=j-i;k++){ cnt[i][j]+=(a[i+k]!=k); } } } memset(f,0x3f,sizeof(f)); f[0][0]=0; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ for(int k=0;k<i;k++){ if(f[k][j-1
]==inf) continue; f[i][j]=min(f[i][j],f[k][j-1]+cnt[k+1][i]); } } } for(int i=1;i<=n;i++) printf("%d\n",f[n][i]); return 0; }