[CSP-S模拟测试]:超级树(DP)
题目传送门(内部题5)
输入格式
一行两个整数$k$、$mod$,意义见上。
输出格式
一行一个整数,代表答案。
样例
样例输入1:
2 100
样例输出1:
9
样例输入2:
3 1000
样例输出2:
245
样例输入3:
20 998244353
样例输出3:
450500168
数据范围与提示
样例解释:
对于第一组样例,将节点如图编号,共有9条不同的路径:1,2,3,1-2,2-1,1-3,3-1,2-1-3,3-1-2。

限制与约定:
对于$10\%$的数据,$k \leqslant 4$。
对于$40\%$的数据,$k \leqslant 10$。
对于$60\%$的数据,$k \leqslant 100$。
另有$10\%$的数据,$mod=998244353$。
对于所有数据,$1 \leqslant k \leqslant 300,1 \leqslant mod \leqslant {10}^9$。
题解
有谁能想到$DP$?举个爪
显然k-超级树是由两个$(k-1)-$超级树合在一起加了个根组成的。
那么好吧,确定了是个$DP$,但是又有谁能想到$DP$的意义呢?
定义$dp[i][j]$表示一棵$i-$超级树,有$j$条没有公共点的路径的方案数。
好像说的有点乱,那么我们拿样例来唠两句:
$dp[2][1]=9$,这很显然,就是样例解释中那$9$种方案。
$dp[2][2]=7$,这七种方案分别是$(1,2)$,$(1,3)$,$(2,3)$,$(2,1-3)$,$(2,3-1)$,$(3,1-2)$,$(3,2-1)$。
$dp[2][3]=1$,这种方案是$(1,2,3)$。
$dp[2][4]=0$,因为一共只有$3$个点,所以我们找不到方案了。
现在开始来推式子吧~
我们来考虑$dp[i]$对$dp[i+1]$的贡献:枚举左子树的路径条数l和有子树的路径条数$r$,记$num=dp[i][l] \times dp[i][r]$。
转移分一下五种情况:
$1.$什么也不做:$dp[i+1][l+r]+=num$。
$2.$跟自己作为一条新路径:$dp[i+1][l+r+1]+=num$,不要忘了根本身还有一条。
$3.$根连接到左子树(或右子树)的某条路径上:$dp[i+1][l+r]+=2 \times num \times (l+r)$。
对于$3$的理解:从左子树里选一条边,延长其终点,连接根的路径条数为$sum \times l$;同理,将起点做如上操作,路径条数也为$sum \times l$;再同理,右子树也是这种操作,路径条数为$2 \times sum \times r$;总的路径条数即为:$dp[i+1][l+r]+=2 \times num \times (l+r)$。
$4.$根连接左子树和右子树的各一条路径:$dp[i+1][l+r-1]+=2 \times num \times l \times r$。
对于$4$的理解:从左子树中选一条边,延长其终点,经根节点连向有子树中一条边的起点,路径条数为:$sum \times l \times r$;同理,从右子树中选一条边也是如此,总的路径条数为:$dp[i+1][l+r-1]+=2 \times num \times l \times r$。
$5.$根连接左子树(或右子树)的两条路径:$dp[i+1][l+r-1]+=num \times (l \times (l-1)+r \times (r-1))$。
对于$5$的理解:左子树中选一条边的终点连向根节点,再将这条边继续延长,连向做字数中另外一条边的起点,路径条数为:$num \times (l \times (l-1))$;右子树中也是如此,路径条数为:$num \times (r \times (r-1))$;总的路径条数即为:$dp[i+1][l+r-1]+=num \times (l \times (l-1)+r \times (r-1))$。
边界为$dp[1][0]=dp[1][1]=1$,答案为$dp[k][1]$。
看起来第二维状态可能有$2^k$那么大,但注意到从$dp[i]$转移到$dp[i+1]$时,路径的条数最多减少1条,因此第二维只有$k$个状态对最终的状态有影响,只$dp$这些状态即可。
时间复杂度$O(k^3)$。
代码时刻
#include<bits/stdc++.h>
using namespace std;
int k;
long long mod,num;
long long dp[310][310];
int main()
{
dp[1][0]=dp[1][1]=1;
scanf("%d%lld",&k,&mod);
for(int i=1;i<k;i++)
for(int l=0;l<=k-i+1;l++)
for(int r=0;r<=k-i-l+2;r++)
{
num=dp[i][l]*dp[i][r]%mod;
dp[i+1][l+r]=(dp[i+1][l+r]+num)%mod;//情况1
dp[i+1][l+r+1]=(dp[i+1][l+r+1]+num)%mod;//情况2
dp[i+1][l+r]=(dp[i+1][l+r]+2*num*(l+r))%mod;//情况3
dp[i+1][l+r-1]=(dp[i+1][l+r-1]+2*num*l*r)%mod;//情况4
dp[i+1][l+r-1]=(dp[i+1][l+r-1]+num*(l*(l-1)+r*(r-1)))%mod;//情况5
}
printf("%lld",dp[k][1]%mod);
return 0;
}
rp++
[CSP-S模拟测试]:超级树(DP)的更多相关文章
- 【NOIP模拟赛】超级树 DP
这个题我在考试的时候把所有的转移都想全了就是新加一个点时有I.不作为II.自己呆着III.连一个IV.连接两个子树中的两个V连接一个子树中的两个,然而V我并不会转移........ 这个题的正解体现了 ...
- [CSP-S模拟测试]:F(DP+线段树)
题目传送门(内部题49) 输入格式 第一行四个整数$n,q,a,b$.接下来$n$行每行一个整数$p_i$. 输出格式 一行一个整数表示答案. 样例 样例输入: 10 3 3 7 样例输出: 数据范围 ...
- [CSP-S模拟测试]:最小值(DP+乱搞)
题目背景 $Maxtir$更喜欢序列的最小值. 题目传送门(内部题128) 输入格式 第一行输入一个正整数$n$和四个整数$A,B,C,D$. 第二行输入$n$个整数,第$i$个数表示$a_i$. 输 ...
- [CSP-S模拟测试]:题(DP)
题目描述 由于出题人赶时间所以没办法编故事来作为背景.一开始有$n$个苹果,$m$个人依次来吃苹果,第$i$个人会尝试吃$u_i$或$v_i$号苹果,具体来说分三种情况.$\bullet 1.$两个苹 ...
- [CSP-S模拟测试]:tree(DP)
题目传送门(内部题57) 输入格式 第一行包含一个数:$n$表示树的节点数.接下来$n-1$行,每行包含两个数:$u,v$表示无根树的一条边. 输出格式 输出$n$行,第$i$行包含一个浮点数,保留三 ...
- [CSP-S模拟测试]:biology(DP)
题目传送门(内部题23) 输入格式 第一行有$2$个整数$n,m$.接下来有$n$行,每行$m$个整数,表示$a$数组.接下来有$n$行,每行$m$个整数,表示$b$数组. 输出格式 一行一个整数表示 ...
- HZOI2019 超级树 dp
题面:https://www.cnblogs.com/Juve/articles/11207540.html(密码)————————————————>>> 题解: 官方题解: 考虑d ...
- [CSP-S模拟测试]:B(DP+数学)
题目传送门(内部题45) 输入格式 第一行$3$个整数$n,m,P$.第二行$m$个整数,表示$m$次询问. 输出格式 一行$m$个整数表示答案. 样例 样例输入1: 2 4 40 1 2 3 样例输 ...
- [CSP-S模拟测试]:蛇(DP+构造+哈希)
题目传送门(内部题140) 输入格式 前两行有两个长度相同的字符串,描述林先森花园上的字母. 第三行一个字符串$S$. 输出格式 输出一行一个整数,表示有多少种可能的蛇,对$10^9+7$取模. 样例 ...
随机推荐
- laravel框架源码分析(一)自动加载
一.前言 使用php已有好几年,laravel的使用也是有好长时间,但是一直对于框架源码的理解不深,原因很多,归根到底还是php基础不扎实,所以源码看起来也比较吃力.最近有时间,所以开启第5.6遍的框 ...
- [LeetCode] 84. 柱状图中最大的矩形
题目链接 : https://leetcode-cn.com/problems/largest-rectangle-in-histogram/ 题目描述: 给定 n 个非负整数,用来表示柱状图中各个柱 ...
- HNUSTOJ-1253 Babelfish(字典树)
1253: Problem C: Babelfish 时间限制: 1 Sec 内存限制: 128 MB提交: 14 解决: 3[提交][状态][讨论版] 题目描述 Problem C: Babel ...
- vue项目1-pizza点餐系统6-路由精讲之复用router-view
1.在主组件展示二级路由的组件内容,在App.vue中添加 <br> <div class="container"> <!-- row 行排列 --& ...
- HTML弹性布局
1.弹性布局的使用 (1) display:flex:给父容器添加这个属性: (2) display:flex; 容器添加弹性布局后,显示为块级元素: display:inline-flex; 容 ...
- SPA(单页面应用)和MPA(多页面应用)
话不多说,直接看图,一目了然
- R语言parse函数与eval函数的字符串转命令行及执行操作
parse()函数能将字符串转换为表达式expression:eval()函数能对表达式求解 A <- : B <- 'print(A)' class(B) C <- parse(t ...
- nice - 改变执行程序的优先级
总览 (SYNOPSIS) nice [OPTION]... [COMMAND [ARG]...] 描述 (DESCRIPTION) 以 调整过的 调度优先级 运行 COMMAND. 如果 没给出 C ...
- num1,随堂笔记(3月10日)
1.计算机发展史(略) 2.我们所使用的计算机包括了计算机硬件.操作系统和应用程序与网络. 3.计算机硬件构成---CPU(运算器和控制器).内存.硬盘.输入设备和输出设备. ①CPU是计算机的主要计 ...
- JavaScript设计模式 样例三 —— 装饰模式
装饰模式(Decorator Pattern): 定义:在不改变原对象的情况下,动态的给对象添加一些额外的职责.就功能而言,装饰模式相比生成子类更为灵活. 目的:把类的核心职责和装饰功能区分开.可以去 ...