您的位置:首页 > 其它

USACO 2.3 Cow Pedigrees(DP)

2012-11-12 21:14 302 查看
不好刷了,这个题想了会,中间还想过卡特兰数列。。。不过好在按照第一感觉就应该是DP,想出了三维的状态转移。。。又MLE,也是不知道给出的提示是神马意思。。。改了滚动数组,过了。效率也不是很高,差点挂掉。dp[i][j][k] 代表第i层,总数为j,最后一层为k个的二叉树种类,然后在这k个上继续搞i+1层。

/*
ID: cuizhe
LANG: C++
TASK: nocows
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define MOD 9901
int c[201][201];
int dp1[201][201],dp2[201][201];
int main()
{
int n,k,i,j,u,ans,m;
freopen("nocows.in","r",stdin);
freopen("nocows.out","w",stdout);
for(i = 0;i <= 200;i ++)
c[i][0] = 1;
for(i = 1;i <= 200;i ++)
{
for(j = 1;j <= i;j ++)
c[i][j] = (c[i-1][j-1] + c[i-1][j])%MOD;
}
scanf("%d%d",&n,&m);
ans = 0;
dp1[1][1] = 1;
for(i = 1;i <= m-1;i ++)
{
for(j = 1;j <= n;j ++)
{
for(k = 1;k <= n&&k <= j;k ++)
{
for(u = 1;j+2*u <= n;u ++)
dp2[j+2*u][2*u] = (dp2[j+2*u][2*u]+c[k][u]*dp1[j][k])%MOD;
}
}
for(j = 1;j <= n;j ++)
{
for(k = 1;k <= n;k ++)
{
dp1[j][k] = dp2[j][k];
}
}
memset(dp2,0,sizeof(dp2));
}
for(i = 1;i <= n;i ++)
{
ans = (ans + dp1
[i])%MOD;
}
printf("%d\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: