洛谷P2279 [HNOI2003] 消防局的设立(树形dp)

ops/2024/10/20 9:12:42/

题目链接

https://www.luogu.com.cn/problem/P2279

思路

我们令 d p [ i ] [ s t a t e ] dp[i][state] dp[i][state]表示节点 i i i s t a t e state state状态下,消防站的最小数量。

对于dp方程的定义如下:

d p [ i ] [ 0 ] dp[i][0] dp[i][0]表示可以覆盖到从节点i向上2层的最小消防站个数, d p [ i ] [ 1 ] dp[i][1] dp[i][1]表示可以覆盖到从节点i向上1层的最小消防站个数, d p [ i ] [ 2 ] dp[i][2] dp[i][2]表示可以覆盖到从节点i向上0层的最小消防站个数, d p [ i ] [ 3 ] dp[i][3] dp[i][3]表示可以覆盖到从节点i向下1层的最小消防站个数, d p [ i ] [ 4 ] dp[i][4] dp[i][4]表示可以覆盖到从节点i向下2层的最小消防站个数。

显然, d p [ i ] [ 0 ] ≥ d p [ i ] [ 1 ] ≥ d p [ i ] [ 2 ] ≥ d p [ i ] [ 3 ] ≥ d p [ i ] [ 4 ] dp[i][0] \ge dp[i][1] \ge dp[i][2] \ge dp[i][3] \ge dp[i][4] dp[i][0]dp[i][1]dp[i][2]dp[i][3]dp[i][4]

对于 d p [ i ] [ 0 ] dp[i][0] dp[i][0] d p [ i ] [ 0 ] = 1 + ∑ s ∈ s o n ( i ) d p [ s ] [ 4 ] dp[i][0] = 1 + \sum_{s\in son(i)} dp[s][4] dp[i][0]=1+sson(i)dp[s][4]

对于 d p [ i ] [ 1 ] dp[i][1] dp[i][1] d p [ i ] [ 1 ] = m i n ( d p [ i ] [ 1 ] , d p [ s ] [ 0 ] + ∑ t ∈ s o n ( i ) d p [ t ] [ 3 ] ) ( s ∈ s o n ( i ) & & t ≠ s ) dp[i][1] = min(dp[i][1],dp[s][0] + \sum_{t \in son(i)} dp[t][3])(s\in son(i) \&\& t \ne s) dp[i][1]=min(dp[i][1],dp[s][0]+tson(i)dp[t][3])(sson(i)&&t=s)

对于 d p [ i ] [ 2 ] dp[i][2] dp[i][2] d p [ i ] [ 2 ] = m i n ( d p [ i ] [ 2 ] , d p [ s ] [ 1 ] + ∑ t ∈ s o n ( i ) d p [ t ] [ 2 ] ) ( s ∈ s o n ( i ) & & t ≠ s ) dp[i][2] = min(dp[i][2],dp[s][1] + \sum_{t \in son(i)} dp[t][2])(s\in son(i) \&\& t \ne s) dp[i][2]=min(dp[i][2],dp[s][1]+tson(i)dp[t][2])(sson(i)&&t=s)

对于 d p [ i ] [ 3 ] dp[i][3] dp[i][3] d p [ i ] [ 3 ] = ∑ s ∈ s o n ( i ) d p [ s ] [ 2 ] dp[i][3] = \sum_{s \in son(i)} dp[s][2] dp[i][3]=sson(i)dp[s][2]

对于 d p [ i ] [ 4 ] dp[i][4] dp[i][4] d p [ i ] [ 4 ] = ∑ s ∈ s o n ( i ) d p [ s ] [ 3 ] dp[i][4] = \sum_{s \in son(i)} dp[s][3] dp[i][4]=sson(i)dp[s][3]

最后的答案即为: d p [ 1 ] [ 2 ] dp[1][2] dp[1][2]

代码

#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int N = 1e3 + 5, M = 1e6 + 5;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f3f3f3f3f;int n;
int dp[N][5];
vector<int>mp[N];
void dfs(int u)
{dp[u][0] = 1;vector<int>v(5, 0);for (int j : mp[u]){	dfs(j);for (int i = 0; i < 5; i++)v[i] += dp[j][i];}dp[u][0] += v[4], dp[u][3] += v[2], dp[u][4] += v[3];dp[u][1] = dp[u][2] = inf;for (int j : mp[u]){dp[u][1] = min(dp[u][1], dp[j][0] + v[3] - dp[j][3]);dp[u][2] = min(dp[u][2], dp[j][1] + v[2] - dp[j][2]);}for (int i = 1; i <= 4; i++)dp[u][i] = min(dp[u][i], dp[u][i - 1]);
}
void solve()
{cin >> n;for (int i = 1, fa; i < n; i++){cin >> fa;mp[fa].push_back(i + 1);}dfs(1);cout << dp[1][2] << 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.ppmy.cn/ops/126939.html

相关文章

C#多线程的4中方式

Thread class Program { static void Main() { Thread thread new Thread(new ThreadStart(DoWork)); thread.Start(); thread.Join(); // 等待线程完成 Console.WriteLine("主线程结束。"); } static void DoWork() { Console.WriteLine("线程开…

AI工具 | Notion全新AI集成:搜索、内容生成、数据分析与智能聊天功能发布

新的 Notion AI 集成了搜索、生成内容、分析数据和智能聊天等功能&#xff0c;所有操作都可以在 Notion 内完成。依托于 GPT-4 和 Claude 等先进的 AI 模型&#xff0c;用户可以与 AI 聊天并获取针对各种话题的答案。 随时使用 在 Notion 页面右下角找到 AI 图标&#xff0c;点…

赏金猎人 | 挖掘TP-Link 服务中的信息泄露漏洞

前言 作为一名专注于安全研究的人员&#xff0c;我经常利用空闲时间探索漏洞奖励计划的世界。尽管传统平台提供了不少有价值的机会&#xff0c;我也会将调查扩展到一些知名厂商的公开系统上。 最近&#xff0c;我在一个 TP-Link 的子域上发现了一个重大安全问题&#xff0c;该…

【C语言】原码 反码 补码

为什么要有原码 反码 补码的概念&#xff1f; 因为在计算机中最终只能识别机器码&#xff0c;是以 0000 0000 二进制作为表示形式&#xff0c;对于一个数&#xff0c;计算机要使用一定的编码方式进行存储&#xff0c;原码 反码 补码是机器存储一个数值的编码方式&#xff0c;最…

外部服务器如何访问专用网络的本地IP

在专用网络&#xff08;如公司内网、专用局域网等&#xff09;中的 IP 地址&#xff0c;也属于本地 IP 地址。这些地址仅在专用网络内部使用&#xff0c;不能直接从互联网访问。本地 IP 地址的范围通常包括以下几类私有地址段&#xff1a; 10.0.0.0 到 10.255.255.255172.16.0…

RabbitMQ 发布确认模式

RabbitMQ 发布确认模式 一、原理 RabbitMQ 的发布确认模式&#xff08;Publisher Confirms&#xff09;是一种机制&#xff0c;用于确保消息在被 RabbitMQ 服务器成功接收后&#xff0c;发布者能够获得确认。这一机制在高可用性和可靠性场景下尤为重要&#xff0c;能够有效防止…

南昌近视手术医生排名更新,速速围观!

在南昌&#xff0c;哪些医生做近视手术好呢&#xff1f;小编已经为大家整理出来啦&#xff01;下文的这些医生均是小编根据多年的从业经验、口碑评价&#xff0c;筛选和整理出来的TOP级医生们&#xff01;南昌近视手术医生排名已更新&#xff0c;赶紧来看看都有谁吧&#xff01…

Python项目Docker服务器部署

Python项目Docker服务器部署 Python项目Docker服务器部署准备工作部署其他问题 Python项目Docker服务器部署 准备工作 1.准备基础镜像 # 指定拉取arm架构镜像 docker pull --platform linux/arm64 python:3.11 # 指定拉取amd架构镜像 docker pull --platform linux/amd64 py…