当前位置: 首页 > news >正文

【树形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

#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;
}

http://www.mrgr.cn/news/41897.html

相关文章:

  • 思维题库 T73 放置商店
  • [Python学习日记-37] Python 中的内置函数(下)
  • CSP-J模拟赛(3)补题报告
  • 【AIGC】ChatGPT账号的常见封号原因与解封方法
  • Go语言实现长连接并发框架 - 任务管理器
  • TypeScript 算法手册 【计数排序】
  • 在线JSON可视化工具--支持缩放
  • Redis入门第五步:Redis持久化
  • leetcode打卡001-约瑟夫问题
  • 栈数据结构:定义,基本操作与应用
  • 探索gmqtt:Python中的AI驱动MQTT库
  • Spring 的 IOC 和 AOP 是什么,有哪些优点?解密 Spring两大核心概念:IOC与AOP的魅力所在
  • LeetCode题练习与总结:丑数 Ⅱ--264
  • 【Java】—— 集合框架:Collection子接口:Set不同实现类的对比及使用(HashSet、LinkedHashSet、TreeSet)
  • 展示批量剪辑分割多个视频,助力轻松剪辑
  • 自研tauri‘2.0+vite5+elementPlus客户端exe聊天系统-源码版
  • YOLO11改进 | 卷积模块 | 添加选择性内核SKConv【附完整代码一键运行】
  • 征程6 工具链常用工具和 API 整理(含新手示例)
  • 动态规划
  • Macos终端常用的命令行指令总结