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; }
相关文章推荐
- USACO-Section 2.3 Cow Pedigrees(DP)
- USACO 2.3 Cow Pedigrees (DP动态规划)
- 【USACO 2.3】Cow Pedigrees(DP)
- USACO 2.3 Money Systems (DP 动态规划 + 空间优化)
- USACO 2.3 Cow Pedigrees
- USACO-Section 2.3 Longest Prefix (DP)
- USACO 2.3 Cow Pedigrees (nocows)
- USACO-Cow Pedigrees(dp)
- USACO Cow Pedigrees 【Dp】
- USACO-Section 2.3 Money Systems(DP)
- USACO section 2.3 Longest Prefix(dp)
- USACO Section2.3 Cow Pedigrees 解题报告 【icedream61】
- USACO section 2.3 Longest Prefix(dp)
- USACO 2.3 Cow Pedigrees 题解
- [USACO2.3]奶牛家谱 Cow Pedigrees
- USACO 2.3 Cow Pedigrees
- USACO Section 2.3 Cow Pedigrees(dp)
- USACO 2.3 Money Systems(DP)
- usaco2.3 nocows dp + 失败的递归
- USACO section2.3 Cow Pedigrees题解&代码