BZOJ5196&&洛谷P4267 [USACO18FEB]Taming the Herd
阿新 • • 發佈:2018-12-10
n^4大力DP
我們定義f[i][j]表示前i天跑了j次 然後我們列舉第j次是在哪天跑的,然後大力轉移就好了
程式碼
//By AcerMo
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int M=150;
int n,a[M],f[M][M];
inline int read()
{
int x=0;char ch=getchar();
while ( ch>'9'||ch<'0') ch=getchar();
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x;
}
inline void write(int x)
{
if (x>9) write(x/10);;
putchar(x%10+'0');
return ;
}
signed main()
{
n=read();
for (int i=1;i<=n;i++) a[i]=read();
memset(f,0x3f,sizeof(f));
f[0][0]=0;
for (int i=1;i<=n;i++)
for (int k=1;k<=i;k++)
for (int j=i;j>=1;j--)
{
int cnt=0,tot=0;
for (int e=j;e<=i;e++)
{
if (cnt!=a[e]) tot++;
cnt++;
}
f[i][k]=min(f[i][k],f[j-1][k-1]+tot);
}
for (int i=1;i<=n;i++)
write(f[n][i]),puts("");
return 0;
}