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

Codeforces Round 926 (Div. 2) D题 Sasha and a Walk in the City(树形dp)

题目链接

Codeforces Round 926 (Div. 2) D题 Sasha and a Walk in the City

思路

题意为计算不存在三点在一条线上的点集的数量。

考虑使用dp。

定义 d p [ i ] [ j ] dp[i][j] dp[i][j]表示以 i i i为根的子树内,从根节点到叶子节点最多经过 j j j选取点。显然, j j j只有为 0 0 0 1 1 1 2 2 2时是合法的。

j = 0 j=0 j=0时, d p [ i ] [ 0 ] dp[i][0] dp[i][0]的答案显然为 1 1 1

j = 1 j = 1 j=1时,最多的情况下便是两条到根的路径合并,最多经过 1 + 1 = 2 1+1=2 1+1=2选取点。所以每一个儿子内可以任意选择。因为可以将 i i i节点这个根选上,所以还要加上没有选取点的方案数。则状态转移方程为: d p [ i ] [ 1 ] = ∏ j ∈ s o n ( i ) ( d p [ j ] [ 0 ] + d p [ j ] [ 1 ] ) dp[i][1] = \prod_{j\in son(i)}^{} (dp[j][0]+dp[j][1]) dp[i][1]=json(i)(dp[j][0]+dp[j][1])

j = 2 j=2 j=2时,由于根到叶子节点最多经过选取点数最大值为 2 2 2,所以只能有一个子树内的dp值可以转移过来。因为根节点可以作为选取点,所以还要加上 1 1 1选取点的方案数。则状态转移方程为: d p [ i ] [ 2 ] = ∑ j ∈ s o n ( i ) ( d p [ j ] [ 1 ] + d p [ j ] [ 2 ] ) dp[i][2] = \sum_{j\in son(i)}^{} (dp[j][1]+dp[j][2]) dp[i][2]=json(i)(dp[j][1]+dp[j][2])

规定 1 1 1为整棵树的根,则最终答案为 d p [ i ] [ 0 ] + d p [ i ] [ 1 ] + d p [ i ] [ 2 ] dp[i][0] + dp[i][1] + dp[i][2] dp[i][0]+dp[i][1]+dp[i][2]

代码

#pragma GCC optimize("O2")
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 3e5 + 5, M = 1e6 + 5;
const int mod = 998244353;
const int inf = 0x3f3f3f3f3f3f3f3f;int n;
int dp[N][3];
vector<int>mp[N];
void dfs(int u, int fu)
{dp[u][0] = 1;dp[u][1] = 1;for (int j : mp[u]){if (j == fu) continue;dfs(j, u);dp[u][1] = dp[u][1] * (dp[j][0] + dp[j][1]) % mod;dp[u][2] = dp[u][2] + (dp[j][1] + dp[j][2]) % mod;}
}
int MOD(int x)
{return (x % mod + mod) % mod;
}
void solve()
{cin >> n;for (int i = 1; i <= n; i++){mp[i].clear();dp[i][0] = dp[i][1] = dp[i][2] = 0;}for (int i = 1, u, v; i < n; i++){cin >> u >> v;mp[u].push_back(v);mp[v].push_back(u);}dfs(1, -1);int ans = 0;for (int i = 0; i <= 2; i++)ans = (ans + dp[1][i]) % mod;cout << MOD(ans) << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int test = 1;cin >> test;for (int i = 1; i <= test; i++){solve();}return 0;
}

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

相关文章:

  • 【Flutter】Dart:pubspec.yaml文件
  • 2024_E_100_英文输入法
  • SpringBoot项目:mybatis升级mybatis-plus
  • Gin框架操作指南12:完结篇
  • Java mybatis day1015
  • 免费分享1885页Python电子书,耗时200小时整理!!!
  • 如何搭建使用采购管理系统?
  • Flask 将表单数据发送到模板
  • T2彩色图片分类
  • 数据结构——广义表
  • MATLAB和Python电车电池制造性能度量分析
  • 51单片机的厨房安全监控系统【proteus仿真+程序+报告+原理图+演示视频】
  • 提示msvcr100.dll丢失的解决方法,推荐这6种解决方法
  • c++前置和后置的运算符重载,红黑树的概念以及static关键字
  • 移动端面试问题笔记(一)
  • 【v5-Lite】模型导入使用-attempt_load
  • 【进阶OpenCV】 (16)-- 人脸识别 -- FisherFaces算法
  • 基于Arduino的简易收音机
  • DW-大模型生图安全疫苗注入作业记录
  • ES6新增特性