牛客网 Wannafly模拟赛2 树 dp+思维
来源:互联网 发布:angelababy百花奖知乎 编辑:程序博客网 时间:2024/06/07 11:07
题目链接
题意:
shy有一颗树,树有n个结点。有k种不同颜色的染料给树染色。一个染色方案是合法的,当且仅当对于所有
相同颜色的点对(x,y),x到y的路径上的所有点的颜色都要与x和y相同。请统计方案数。
思路:
这个题真的很不好想,只要想到了就很简单了,当然我也没想,因为没机会啊
根据题意的描述,所有被染成同一个颜色的都是一个连通图,也就是很多个子树,你将这棵树用多少种颜色染色,拆分
出来之后就会有多少个子树,每个子树当中节点的颜色一样.
那么我们就可以用dp来简单计数,dp[i][j] 表示 i个点染成j个颜色的方案数.那么有:
dp[i][j] = dp[i-1][j]+dp[i-1][j-1]*(k-(j-1))
即第i个点要么和第i-1个点颜色相同,要么不同,不同的话前面用过的颜色都不能用了,还剩k-j+1种颜色.
PS : 也可以这样想,你把n个点,按照颜色相同的看成一个连通块,总能对应树上的一种染色方法,每一个连通块就是子树.
#include<bits/stdc++.h> using namespace std; const int maxn = 333;typedef long long ll;const ll mod = 1e9 + 7; ll dp[maxn][maxn];int n,k;int main(){ while(~scanf("%d %d",&n,&k)) { memset(dp,0,sizeof dp); int a,b; for(int i = 1;i < n;i++) scanf("%d %d",&a,&b); dp[0][0] = 1; for(int i = 1;i <= n;i++) { for(int j = 1;j <= k;j++) { dp[i][j] = dp[i-1][j] + dp[i-1][j-1]*(k - j + 1); dp[i][j] %= mod; } } ll ans = 0; for(int i = 1;i <= k;i++) ans = (ans + dp[n][i]) % mod; printf("%lld\n",ans); }}
阅读全文
0 0
- 牛客网 Wannafly模拟赛2 树 dp+思维
- Wannafly模拟赛 树【思维+Dp】
- Wannafly模拟赛 树(dp)
- Wannafly 模拟赛5 E 思维+数论
- Wannafly挑战赛2 C 思维 + 线段树
- Wannafly模拟赛3 贝伦卡斯泰露 【折半搜索+hash,状压dp】
- Wannafly模拟赛2 A题
- 10.9wannafly模拟赛
- Wannafly模拟赛4
- Wannafly模拟赛3
- Wannafly模拟赛3 题解
- Wannafly模拟赛3 题解
- Wannafly模拟赛5 ASplit
- Wannafly模拟赛5 DAria
- Wannafly模拟赛4 题解
- 牛客网 Wannafly模拟赛 矩阵 二分+hash矩阵
- 牛客网 Wannafly模拟赛 矩阵 二分+hash矩阵
- Wannafly模拟赛3 监视任务(贪心+线段树)
- Android pppd_gprs脚本启动过程
- 可见性和原子性
- Latex排版学习笔记(1)——希腊字母表及其在latex中的表示
- 支付宝第三方接口对接(JAVA语言)
- 进程和应用程序的区别(简单理解)
- 牛客网 Wannafly模拟赛2 树 dp+思维
- 在线画图工具
- fg代码阅读笔记1
- Java程序界面Swing设计
- Java并发包之BlockingQueue
- 实现最小栈
- Windows平台下python3配置虚拟环境遇到的问题【Virtualenv】
- HDU 4775 Infinite Go(暴力模拟+BFS)
- 提高数据库查询效率小结