\(\texttt{Solution}\)

首先考虑 \(\texttt{dp}\) 维护题目要求的深度为 \(i\), 每个节点最多经过一次的不同有向路径数量 \(f_i\)。

明显的,只维护这个东西是不对的,因为忽视了这样的情况:

这样子这条路径是由原来的被蓝色圈圈包住的两个部分转移而来。

那么考虑记录 \(g_i\) 为两条不相交的有向路径数量。

然后蒟蒻兴冲冲地去 尝试了, 并过了前两个样例,但是过不了第三个样例,这是为什么?

发现 \(g_i\) 也有可能是由三条不相交的有向路径转移而来!

那么正解就浮出水面了:维护深度为 \(i\), \(j\) 条不相交的有向路径数量 \(dp_{i,j}\)。

转移如果想明白了状态其实很简单。这里还是说一下。

首先用背包求出深度为 \(i-1\), 和为 \(j\) 条不相交的有向路径数量 : bb[j] += dp[i - 1][k] * dp[i - 1][j - k]

第一种转移:根结点独立,然后其他的路径让两个子树自由组合 : dp[i][j] += bb[j - 1] + 2 * dp[i - 1][j - 1]

第二种转移:路径不包括根结点,或根结点为路径起点或终点: dp[i][j] += (2 * j + 1) * bb[j] + (4 * j + 2) * dp[i - 1][j]

第三种转移:路径包括根结点,且连接两条原来在子树中是两条链: dp[i][j] += j * (j + 1) * bb[j + 1] + 2 * j * (j + 1) * dp[i - 1][j + 1]

\(\texttt{Code}\)

#include<bits/stdc++.h>
#define L(i, j, k) for(int i = j; i <= k; i++)
#define R(i, j, k) for(int i = j; i >= k; i--)
using namespace std;
const int N = 444;
const int mod = 1e9 + 7;
int n, dp[N][N], bb[N];
int main() {
scanf("%d", &n);
dp[1][1] = 1;
L(i, 2, n) {
fill(bb, bb + n + 1, 0);
L(j, 1, n) L(k, 0, j) (bb[j] += 1ll * dp[i - 1][k] * dp[i - 1][j - k] % mod) %= mod;
dp[i][1] = 1;
L(j, 1, n) {
int t = 0;
(dp[i][j] += (2ll * j + 1) * bb[j] % mod) %= mod;
(dp[i][j] += (4ll * j + 2) % mod * dp[i - 1][j] % mod) %= mod;
(dp[i][j] += 1ll * j * (j + 1) % mod * bb[j + 1] % mod) %= mod;
(dp[i][j] += 2ll * j * (j + 1) % mod * dp[i - 1][j + 1] % mod) %= mod;
(dp[i][j] += bb[j - 1] % mod) %= mod;
(dp[i][j] += 2ll * dp[i - 1][j - 1] % mod) %= mod;
}
}
printf("%d\n", dp[n][1]);
return 0;
}

题解 CF830D Singer House的更多相关文章

  1. 【做题记录】DP 杂题

    P2577 [ZJOI2004]午餐 $\texttt{solution}$ 想到贪心: 吃饭慢的先打饭节约时间, 所以先将人按吃饭时间从大到小排序. 状态: \(f[i][j]\) 表示前 \(i\ ...

  2. Codeforces 830D Singer House 动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF830D.html 题解 考虑用 $dp[i][j]$ 表示深度为 $i$ 的树里,有 $j$ 条路径的方案数 ...

  3. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  4. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  5. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  6. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  7. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  8. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  9. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

随机推荐

  1. binary hacks读数笔记(nm命令)

    nm命令(names):输出包含三个部分:1 符号值.默认显示十六进制,也可以指定: 2 符号类型.小写表示是本地符号,大写表示全局符号(external); 3 符号名称. 例如:nm Simple ...

  2. K最邻近分类

    最邻近分类是分类方法中比较简单的一种,下面对其进行介绍 1.模型结构说明        最邻近分类模型属于"基于记忆"的非参数局部模型,这种模型并不是立即利用训练数据建立模型,数据 ...

  3. mysql之冷备和mysqldump、mydumper、xtrabackup备份

    1.冷备流程: 停库备份,冷备份一般用于非核心业务,这类业务一般都允许停库. 在停止数据库后,将数据文件拷贝出来,然后对原始数据文件进行备份. 流程: 1.关闭数据库备份          2.拷贝数 ...

  4. mysql之数据锁

  5. 02、MyBatis XML 全局配置文件

    MyBatis-全局配置文件 在MyBatis中全局配置文件有着重要的地位,里面有9类行为信息;如果我们要想将MyBatis运用的熟练,配置全局配置文件是必不可少的步骤,所以我们一定要啃下这一块硬骨头 ...

  6. redhat-DHCP服务的配置与应用

    DHCP服务器为客户端提供自动分配IP地址的服务,减轻网管的负担 首先 rpm -q dhcp 查看是否安装dhcp yum -y install dhcp进行安装 安装完成 dhcp服务配置 dhc ...

  7. Druid配置和初始化参数 转发地址图片有

    配置数据源 1.添加上 Druid 数据源依赖. <!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <dep ...

  8. ABBYY FineReader 14如何查看PDF文档

    使用 ABBYY FineReader,您可以轻松查看和编辑任何类型的 PDF文档,就像是一款功能强大的PDF编辑转换器,不仅如此,它还能够允许您复制其中的文本.图片和表格.本文我们来看看如何从&qu ...

  9. leetcode 56合并区间 java

    //先排序,将左区间小的放在前面,然后如果前一个的右区间大于下一个的左区间,则可以合并,分别用两个下标指向当前的大区间和将要考察的小区间 class Solution {    public int[ ...

  10. 一键加Q群的实现

    打开网址 选择创建的群 选择所需要的二维码或者代码