USACO2.3.2 Cow Pedigrees (nocows)

本文详细探讨了USACO竞赛中2.3.2章节的Cow Pedigrees问题,重点讲解了解题策略和注意事项,包括处理过程中如何适时取模以及避免在减法操作中出现负数的情况,提出解决方案为使用(dp[k][n] - dp[k - 1][n] + 9901) % 9901。
摘要由CSDN通过智能技术生成
dp[k][n]表示节点数为n,高度不大于k的结构数。
初始状态:dp[i][1]=1
转移:dp[k][n] = ∑(dp[k - 1][s] * dp[k - 1][n - s - 1]) (s = 1 to n-2)
因为对于每一棵树T都可以分解为根节点与两个子树T1,T2,高度均不大与k-1,节点数之和s1+s2=n-1,结构数为p1,p2。
对于每一组不同的s1,s2,T的结构数即p=p1*p2。
所以T的总结构数就是对于所有不同的s1,s2的p的和即dp[k][n] = ∑(dp[k - 1][s] * dp[k - 1][n - s - 1]) (s = 1 to n-2)
注意状态是节点数为n,高度“不大与”k的结构数。
所以最后结果为dp[k][n] - dp[k - 1][n]。

注意随时取模,还有就是最后减的时候可能减到负数,所以应该(dp[k][n] - dp[k - 1][n] + 9901) % 9901)。

/*
ID:shijiey1
PROG:nocows
LANG:C++
*/
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int n, k;
int dp[210][210];
int main() {
	freopen("nocows.in", "r", stdin);
	freopen("nocows.out", "w", stdout);
	scanf("%d %d", &n, &k);
	f
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值