计蒜客 奇异家庭 (DP)
**链接 : ** Here!
思路 :
首先这棵家族树非常非常非常有特点, 家族里的人要么没有孩子, 要么有两个孩子, 所以这棵家族树是一颗满二叉树.
设定状态 $dp[i][j]$ 为 $i$ 个人组成的不超过 $j$ 层的家谱结构种数, 首先明确一点, 那些状态会为这个状态贡献值 ? 自然能够想到左右两个孩子, 也就是 $dp[m][j-1]$, $dp[i-1-m][j-1]$ $(1 \leq m \leq i-2)$ , 那么很自然的就能够得到状态转移方程 :
1. $dp[1][j] = 1, (1 \leq j \leq K)$
2. $dp[i][j] = \prod_{m = 1}^{i - 2} {(dp[m][j - 1] * dp[i - 1 - m][j - 1])}, (m \neq 偶数, 2 \leq i \leq N, i \neq 偶数, 2 \leq j \leq K)$为什么上面状态转移方程中 $i$ 和 $m$ 都必须为奇数呢, 因为家谱树是一棵满二叉树, 所以节点数量只可能是奇数.
补充 :
- 满二叉树:树中除了叶子节点,每个节点都有两个子节点
- 完全二叉树:在满足满二叉树的性质后,最后一层的叶子节点均需在最左边
- 完美二叉树:满足完全二叉树性质,树的叶子节点均在最后一层(也就是形成了一个完美的三角形)
- 一定要和国内的二叉树分类相区别!!!
**代码 : **
/*************************************************************************
> File Name: 奇异家庭.cpp
> Author:
> Mail:
> Created Time: 2017年11月21日 星期二 00时14分38秒
************************************************************************/
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
// 状态转移方程为dp[i][j] : i个人数组成的不超过j层的家谱结构数
// 假设左子树的节点数量为m, 则右子树的节点数量为i - 1 - m, 注意左右子树节点也一定得是奇数
// 因此dp[i][j] = SIGMA(dp[m][j - 1] * dp[i - 1 - m][j - 1]) (0 < m < i - 1)
const int MAX_N = 200 + 10;
const int MAX_K = 100 + 10;
const int MOD = 9901;
int dp[MAX_N][MAX_K];
int n, k;
void solve() {
memset(dp, 0, sizeof(dp));
for (int j = 1 ; j <= k ; ++j) {
dp[1][j] = 1;
}
for (int j = 2 ; j <= k ; ++j) {
// 注意奇数的情况下是不存在解的
for (int i = 3 ; i <= n ; i += 2) {
int sum = 0;
for (int m = 1 ; m < i - 1 ; m += 2) {
sum = (sum + (dp[m][j - 1] * dp[i - 1 - m][j - 1])) % MOD;
}
dp[i][j] = sum % MOD;
}
}
// 注意, 如果不取模的话dp[n][k] >= dp[n][k - 1]
// 但是如果有了取模运算,dp[n][k]就有可能小于dp[n][k - 1]了
printf("%d\n", (dp[n][k] - dp[n][k - 1] + MOD) % MOD);
}
int main() {
scanf("%d%d", &n, &k);
if (!(n & 1)) printf("0\n");
else solve();
return 0;
}
计蒜客 奇异家庭 (DP)的更多相关文章
- 计蒜客 31436 - 提高水平 - [状压DP]
题目链接:https://nanti.jisuanke.com/t/31436 作为一名车手,为了提高自身的姿势水平,平时的练习是必不可少的.小 J 每天的训练包含 $N$ 个训练项目,他会按照某个顺 ...
- 计蒜客 31434 - 广场车神 - [DP+前缀和]
题目链接:https://nanti.jisuanke.com/t/31434 小 D 是一位著名的车手,他热衷于在广场上飙车.每年儿童节过后,小 D 都会在广场上举行一场别样的车技大赛. 小 D 所 ...
- [计蒜客] 矿石采集【记搜、Tarjan缩点+期望Dp】
Online Judge:计蒜客信息学3月提高组模拟赛 Label:记搜,TarJan缩点,树状数组,期望Dp 题解 整个题目由毫无关联的两个问题组合成: part1 问题:对于每个询问的起点终点,求 ...
- 计蒜客 NOIP 提高组模拟竞赛第一试 补记
计蒜客 NOIP 提高组模拟竞赛第一试 补记 A. 广场车神 题目大意: 一个\(n\times m(n,m\le2000)\)的网格,初始时位于左下角的\((1,1)\)处,终点在右上角的\((n, ...
- 2019计蒜客信息学提高组赛前膜你赛 #2(TooYoung,TooSimple,Sometimes Naive
计蒜客\(2019CSP\)比赛第二场 巧妙爆零这场比赛(我连背包都不会了\(QWQ\) \(T1\) \(Too\) \(Young\) 大学选课真的是一件很苦恼的事呢! \(Marco\):&qu ...
- 计蒜客 作弊揭发者(string的应用)
鉴于我市拥堵的交通状况,市政交管部门经过听证决定在道路两侧安置自动停车收费系统.当车辆驶入车位,系统会通过配有的摄像头拍摄车辆画面,通过识别车牌上的数字.字母序列识别车牌,通过连接车管所车辆信息数据库 ...
- 计蒜客的一道题dfs
这是我无聊时在计蒜客发现的一道题. 题意: 蒜头君有一天闲来无事和小萌一起玩游戏,游戏的内容是这样的:他们不知道从哪里找到了N根不同长度的木棍, 看谁能猜出这些木棍一共能拼出多少个不同的不等边三角形. ...
- 计蒜客模拟赛5 D2T1 成绩统计
又到了一年一度的新生入学季了,清华和北大的计算机系同学都参加了同一场开学考试(因为两校兄弟情谊深厚嘛,来一场联考还是很正常的). 不幸的是,正当老师要统计大家的成绩时,世界上的所有计算机全部瘫痪了. ...
- 计蒜客 等边三角形 dfs
题目: https://www.jisuanke.com/course/2291/182238 思路: 1.dfs(int a,int b,int c,int index)//a,b,c三条边的边长, ...
随机推荐
- MVC.Net:读取Web.config/App.config配置
需要读取Web.config/App.config的配置很简单,首先我们需要将配置写入到<appSettings>中,例如: <appSettings> <add key ...
- C语言实现的lisp解析器介绍
近期.由于Perl而学习函数式编程, 再进一步学习lisp, 真是一学习就发现自己的渺小. 无意中找到了一个很easy的C语言版的, lisp解析器. 代码非常短, 却非常见功底, 涨姿势了. 附带还 ...
- maven出现不再支持源选项 1.5。请使用 1.6 或更高版本
maven出现不再支持源选项 1.5.请使用 1.6 或更高版本 学习了:http://blog.csdn.net/sosous/article/details/78312867 错误: [ERROR ...
- 利用keepalive和timeout来推断死连接
问题是这样出现的. 操作:client正在向服务端请求数据的时候,突然拔掉client的网线. 现象:client死等.服务端socket一直存在. 在网上搜索后,须要设置KEEPALIVE属性. 于 ...
- mac下安装tensorflow及入门例子
https://www.tensorflow.org/install/install_mac 使用virtualenv安装,virtualenv相当于使tensorflow运行在虚拟机环境下. 需要使 ...
- luogu2278 [HNOI2003]操作系统
题目大意 写一个程序来模拟操作系统的进程调度.假设该系统只有一个CPU,每一个进程的到达时间,执行时间和运行优先级都是已知的.其中运行优先级用自然数表示,数字越大,则优先级越高.如果一个进程到达的时候 ...
- treap平衡树
今天集训讲平衡树,就瞎搞了一下.直接下代码. #include<iostream> #include<cstdio> #include<cmath> #includ ...
- ”W: GPG 错误:http://ppa.launchpad.net lucid Release: 由于没有公钥,无法验证下列签名:“的问题
在安装更新时,即在运行,命令行sudo apt-get update 或者运行更新管理器的时候,出现如下错误: W: GPG 错误:http://ppa.launchpad.net lucid Rel ...
- Shredding Company(dfs)
http://poj.org/problem?id=1416 题意:将一个数分成几部分,使其分割的各个数的和最大并且小于所给的数. 凌乱了..参考的会神的代码..orz... #include < ...
- LeetCode Weekly Contest 28
1. 551. Student Attendance Record I 2. 552. Student Attendance Record II hihocode原题,https://hihocode ...