【树形DP】AT_dp_p Independent Set 题解

step 1 题意理解

  • 有一棵有 N N N 个顶点的树,编号为 1 , 2 , ... , N 1,2,...,N 1,2,...,N。
  • Taro 决定将每个顶点涂成白色或黑色。 在这里,不允许将相邻的两个顶点都涂成黑色
  • 找出可以涂色的方式数量,对 1 0 9 + 7 10^9 + 7 109+7 取模。

step 2 样例解释

【样例输入】

3

1 2

2 3

【样例输出】

5

【样例解释】

step 3 做法解释

  1. 考虑与没有上司的舞会 相同的分类方法,对 d p dp dp 数组额外开一维来记录上一层的是否是黑色
  2. 对于每一次转移,都有以下转移方程:
  • { f i , j = f i , j × ( f v , 0 + f v , 1 ) j = 0 f i , j = f i , j × f v , 0 j = 1 \begin{cases} f_{i,j} = f_{i,j}\times (f_{v,0} + f_{v,1} )& j = 0 \\ f_{i,j} = f_{i,j}\times f_{v,0} & j = 1 \end{cases} {fi,j=fi,j×(fv,0+fv,1)fi,j=fi,j×fv,0j=0j=1
  • v v v 是 i i i 的儿子

step 4 AC code

cpp 复制代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod = 1e9 + 7;

ll n,vis[100005],dp[100005][2];
vector<ll> tree[100005];

void dfs(int xx){
	dp[xx][0] = dp[xx][1] = 1;
	//cout << tree[xx].size();
	//cout << xx << endl;
	for(int zz : tree[xx]){
		if(!vis[zz]){
			vis[zz] = 1;
			dfs(zz);
			dp[xx][0] *= dp[zz][0] + dp[zz][1];
			dp[xx][0] %= mod;
			dp[xx][1] *= dp[zz][0];
			dp[xx][1] %= mod;
		}
	}
}

int main(){
	cin >> n;
	for(int i = 1; i < n ;i++){
		int x,y;
		cin >> x >> y;
		tree[y] . push_back(x);
		tree[x] . push_back(y);
	}
	vis[1] = 1;
	dfs(1);
	cout << (dp[1][0] + dp[1][1]) % mod;
	return 0;
}
相关推荐
冉佳驹4 分钟前
C++ ——— 动态内存管理和泛型编程的核心机制
c++·delete·模板·new·operator new·operator delete·定位 new
程序猿编码6 分钟前
恶意软件分析工具:ELF二进制文件的感染与分析原理(C/C++代码实现)
c语言·c++·网络安全·信息安全·elf·shellcode
资深低代码开发平台专家7 分钟前
通用编程时代正在向专用化分层演进
java·大数据·c语言·c++·python
Wild_Pointer.9 分钟前
项目实战:使用QCustomPlot实现多窗口绘制数据(支持GPU加速)
c++·qt·gpu算力
TL滕10 分钟前
从0开始学算法——第六天(进阶排序算法)
笔记·学习·算法·排序算法
TL滕14 分钟前
从0开始学算法——第六天(进阶排序算法练习)
笔记·python·学习·算法·排序算法
課代表21 分钟前
正弦函数与椭圆的关系
数学·算法·几何·三角函数·椭圆·正弦·周长
张望远-长风万里23 分钟前
练习实践-win10自带命令工具certutil进行文件校验和生成实践
学习
zl_vslam24 分钟前
SLAM中的非线性优-3D图优化之相对位姿Between Factor(七)
人工智能·算法·计算机视觉·3d
CoderYanger24 分钟前
动态规划算法-简单多状态dp问题:12.打家劫舍Ⅱ
开发语言·算法·leetcode·职场和发展·动态规划·1024程序员节