[luoguP1472] 奶牛家谱 Cow Pedigrees(DP)

传送门

一个深度为i的树可以由一个根节点外加两个深度为i-1的树组成,这就决定了DP该怎么写。

然而我真的没有想到。

f[i][j]表示深度为i节点数为j的个数

sum[i][j]表示深度小于等于i节点树为j的个数

#include <cstdio>
#define N 402
#define p 9901

int n, m;
int f[N][N], sum[N][N];
//f[i][j]表示深度为i节点数为j的个数
//sum[i][j]表示深度<=i节点数为j的树的个数

int main()
{
	int i, j, k;
	scanf("%d %d", &n, &m);
	if(!(n & 1))
	{
		puts("0");
		return 0;
	}
	f[1][1] = sum[1][1] = 1;
	for(i = 2; i <= m; i++)
	{
		//两个深度都是i-1
		for(j = 1; j <= n; j++)
			for(k = 1; k <= n; k++)
				f[i][1 + j + k] = (f[i][1 + j + k] + f[i - 1][j] * f[i - 1][k] % p) % p;
		//一个深度为i-1
		for(j = 1; j <= n; j++)
			for(k = 1; k <= n; k++)
				f[i][1 + j + k] = (f[i][1 + j + k] + f[i - 1][j] * sum[i - 2][k] * 2 % p) % p;
		//更新sum
		for(j = 1; j <= n; j++)
			sum[i][j] = (sum[i - 1][j] + f[i][j]) % p;
	}
	printf("%d\n", f[m][n]);
	return 0;
}

  

时间: 2024-12-23 18:06:16

[luoguP1472] 奶牛家谱 Cow Pedigrees(DP)的相关文章

洛谷P1472 奶牛家谱 Cow Pedigrees

P1472 奶牛家谱 Cow Pedigrees 102通过 193提交 题目提供者该用户不存在 标签USACO 难度普及+/提高 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 农民约翰准备购买一群新奶牛. 在这个新的奶牛群中, 每一个母亲奶牛都生两个小奶牛.这些奶牛间的关系可以用二叉树来表示.这些二叉树总共有N个节点(3 <= N < 200).这些二叉树有如下性质: 每一个节点的度是0或2.度是这个节点的孩子的数目. 树的高度等于K(1 < K < 100).高度是从

奶牛家谱 Cow Pedigrees

令人窒息的奶牛题 题目描述 农民约翰准备购买一群新奶牛. 在这个新的奶牛群中, 每一个母亲奶牛都生两个小奶牛.这些奶牛间的关系可以用二叉树来表示.这些二叉树总共有N个节点(3 <= N < 200).这些二叉树有如下性质: 每一个节点的度是0或2.度是这个节点的孩子的数目. 树的高度等于K(1 < K < 100).高度是从根到最远的那个叶子所需要经过的结点数; 叶子是指没有孩子的节点. 有多少不同的家谱结构? 如果一个家谱的树结构不同于另一个的, 那么这两个家谱就是不同的.输出可

【luogu1472】 奶牛家谱 Cow Pedigrees [动态规划]

一时暴搜一时爽 一直暴搜一直爽  cxl居然和我写的同款dfs,天呢 菜鸡开始对这题并没有什么想法 状态方程死活想不出来 还是暴搜好 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define rg register 5 const int N=200,K=100,P=9901; 6 int n,k,f[K+5][N+5],ans=0; 7 template <class t>v

USACO 2.3 Cow Pedigrees

Cow Pedigrees Silviu Ganceanu -- 2003 Farmer John is considering purchasing a new herd of cows. In this new herd, each mother cow gives birth to two children. The relationships among the cows can easily be represented by one or more binary trees with

【USACO 2.3.2】奶牛家谱

[题目描述] 农民约翰准备购买一群新奶牛.在这个新的奶牛群中,每一个母亲奶牛都生两小奶牛.这些奶牛间的关系可以用二叉树来表示.这些二叉树总共有N个节点(3 <= N < 200).这些二叉树有如下性质: 每一个节点的度是0或2.度是这个节点的孩子的数目. 树的高度等于K(1 < K < 100).高度是从根到最远的那个叶子所需要经过的结点数;叶子是指没有孩子的节点. 有多少不同的家谱结构?如果一个家谱的树结构不同于另一个的,那么这两个家谱就是不同的.输出可能的家谱树的个数除以990

poj 1163 The Triangle &amp;poj 3167 Cow Bowling (dp)

链接:poj 1163 题意:输入一个n层的三角形,第i层有i个数,求从第1层到第n层的所有路线中,权值之和最大的路线. 规定:第i层的某个数只能连线走到第i+1层中与它位置相邻的两个数中的一个. 状态方程:f[i][j]=max(f[i-1][j-1],f[i-1][j])+a[i][j]; 1163代码: #include<stdio.h> #include<string.h> int a[105][105],f[105][105]; int max(int a,int b)

2.3.2 COW PEDIGREES 奶牛家谱

解题思路: 1.简单动态规划.基本思想是用小的二叉树去组成大的二叉树,最后输出dp[k][n]-dp[k-1][n]恰好就是要求的n个 点组成深度最多为k的方法数 2.设dp[i][j]表示j个点组成深度最多为i的二叉树的方法数,则动态规划公式为: dp[i][j]=∑(dp[i-1][l]*dp[i-1][j-1-l])(1<=l<=j-2) dp[i][1]=1 3.注意:点的个数总为奇数. 核心代码: for(i=1;i<=k;i++) dp[i][1]=1; for(i=1;i&

BZOJ(begin) 1375 [Usaco2009 Mar]Cow Frisbee Team 奶牛沙盘队:dp【和为f的倍数】

题目链接:http://begin.lydsy.com/JudgeOnline/problem.php?id=1375 题意: 给你n个数,你可以从中选任意多个,但不能不选.问你所选数字之和为f的倍数的方案数. 题解: 表示状态: dp[i][j] = num of ways i:考虑到第i个数(还没选) j:之前所选数之和 MOD f == j 找出答案: ans = dp[n][0] - 1 不选也是一种方案,但题目种要求不能不选,所以-1. 如何转移: 选或不选第i个数. dp[i+1][

USACO Cow Pedigrees 【Dp】

一道经典Dp不过现在还不是能特别理解. 定义dp[i][j] 表示由i个节点,j 层高度的累计方法数 状态转移方程为: 用i个点组成深度最多为j的二叉树的方法树等于组成左子树的方法数 乘于组成右子树的方法数再累计. 暂贴代码: /* ID: wushuai2 PROG: nocows LANG: C++ */ //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #include <stdio.h>