BZOJ5196&&洛谷P4267 [USACO18FEB]Taming the Herd

版权声明:我这么弱的蒟蒻,虽然博文不是很好,但也请标明转发地址喵! https://blog.csdn.net/ACerAndAKer/article/details/82763219

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

猜你喜欢

转载自blog.csdn.net/ACerAndAKer/article/details/82763219