bzoj 5196: [Usaco2018 Feb]Taming the Herd (dp)
阿新 • • 發佈:2018-12-09
Solution
表示前 天經歷出逃了 次,且第 天進行了出逃
其中 表示 和 的差別數
這樣我們可以得到 的暴力
但是我們可以預處理出來這個
用 表示 和
然後就可以得到一個 的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;
}