AcWing 1077. 皇宫看守(树形DP + 状态机DP)

news2024/12/28 4:08:41

AcWing 1077. 皇宫看守(树形DP + 状态机DP)

  • 一、问题
  • 二、分析
    • 1、思路分析
    • 2、状态表示
    • 3、状态转移
    • 4、循环设计
    • 5、初末状态
  • 三、代码

一、问题

在这里插入图片描述

二、分析

1、思路分析

在讲解这道题之前,大家需要对状态机DP有一定的了解,如果不了解或者不太清楚的话,可以先去看作者之前的文章:第四十七章 动态规划——状态压缩模型

我们用下面的图进行分析:
在这里插入图片描述
我们以2号点为例子,观察一下能够看到2号点的点:
2号点的父节点:1

2号点的子节点:4和5

2号点自己

如果我们不选2号点的话,分为下面两种情况:
第一种:
如果2号点能够被父节点看到的话,那么2号点的子节点4和5选不选都行。因为2号点已经有人能看到了。
第二种:
如果2好点能够被子节点看到的话,那么2号点的子节点至少选一个,由于题目中要求的是最小,所以我们只要在子节点中选一个就行。

如果我们选了2号点,即2号点能够被自己看到的话:

子节点随便选,挑一个最小值的就行。

我们发现2号点选和不选对于子树的选择也产生了一定的影响,因此我们需要采用状态机DP。

2、状态表示

f [ u ] [ j ] f[u][j] f[u][j]表示在以 u u u为根节点的树中,当 u u u的状态是 j j j的时候,我们选择的最少节点。

其中:

j = 0 j=0 j=0的时候,表示 u u u不选,但是 u u u能够被父亲观察到。

j = 1 j=1 j=1的时候,表示 u u u不选,但是 u u u能够被子节点看到。

j = 2 j=2 j=2的时候,表示选 u u u, u u u至少能被自己看到。

3、状态转移

我们一个情况一个情况的分析:

j = 0 j=0 j=0的时候

u u u没选,那么对于其子节点而言, f [ s o n ] [ 0 ] f[son][0] f[son][0]就是不存在的,因为这个状态是说没有选节点 s o n son son,但是 s o n son son能够被父节点观察到。我们根本就没选它的父节点 u u u,又怎么会被观察到呢?所以这种情况不存在。

那么由于 u u u已经被父节点观察到了,那么他的子节点 s o n son son选或者不选,能被谁看到,对于 u u u而言是不重要的,我们只需要选出一个最小值即可。

那么针对每个子树都选出一个最小值,最后加在一起就行了。

f [ u ] [ 0 ] = ∑ m i n ( f [ s o n ] [ 1 ] , f [ s o n ] [ 2 ] ) f[u][0]=\sum min(f[son][1],f[son][2]) f[u][0]=min(f[son][1],f[son][2])

j = 1 j=1 j=1的时候
u u u没选,并且 u u u能够被子节点观察到,由于 u u u没选,根据刚刚的理由,我们子节点状态中合法的只有两个了: f [ s o n ] [ 1 ] f[son][1] f[son][1] f [ s o n ] [ 2 ] f[son][2] f[son][2]

题目中要求至少,也就是我们需要拿出一个son是必须选状态 f [ s o n ] [ 2 ] f[son][2] f[son][2]的,其余的在两个状态之间选出一个最小值,最后加在一起。

但是我们具体拿出来哪个还是不确定的,所以我们需要枚举一下,然后在所有的情况中再选最小值。

f [ u ] [ 1 ] = m i n ( f [ s o n k ] [ 2 ] + ∑ i ≠ k m i n ( f [ s o n i ] [ 1 ] , f [ s o n i ] [ 2 ] ) ) f[u][1]= min\bigg(f[son_k][2]+\sum_{i \neq k} min(f[son_i][1],f[son_i][2])\bigg) f[u][1]=min(f[sonk][2]+i=kmin(f[soni][1],f[soni][2]))

j = 2 j=2 j=2的时候
这个情况是最好处理的,这种情况说明我们选了 u u u,那么子节点的三种情况都可选,挑一个最小的就行。
f [ u ] [ 2 ] = m i n ( f [ s o n ] [ 0 ] , f [ s o n ] [ 1 ] , f [ s o n ] [ 2 ] ) f[u][2]=min(f[son][0],f[son][1],f[son][2]) f[u][2]=min(f[son][0],f[son][1],f[son][2])

4、循环设计

我们这个是1维的,所以写一个for循环就行,但是由于我们的这些节点存储在了树上,所以我们需要用DFS代替。

5、初末状态

f [ u ] [ 2 ] = v [ u ] f[u][2]=v[u] f[u][2]=v[u],因为这个状态说明我们选了节点 u u u

三、代码

由于是从根节点开始,所以需要选出根节点,即我们标记所有的子节点,最后剩下的就是根节点 r o o t root root

#include<bits/stdc++.h>
using namespace std;
const int N = 1510, M = 2 * N;
const int INF = 0x3f3f3f3f;
int h[N], e[M], ne[M], v[N], idx;
bool son[N];
int n;
int f[N][3];
void add(int a, int b)
{
	e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
void dfs(int u)
{
	f[u][2] = v[u];
	int sum = 0;
	for(int i = h[u]; i != -1; i = ne[i])
	{
		int j = e[i];
		dfs(j);
		f[u][0] = f[u][0] + min(f[j][1],f[j][2]);
		f[u][2] = f[u][2] + min(min(f[j][0], f[j][1]), f[j][2]); 
		sum += min(f[j][1], f[j][2]);
	}
	f[u][1] = INF;
	for(int i = h[u]; i != -1; i = ne[i])
	{
		int j = e[i];
		f[u][1] = min(f[u][1], sum - min(f[j][1], f[j][2]) + f[j][2]);
	}
}
int main()
{
	memset(h, -1, sizeof h);
	cin >> n;
	int root = 1;
	for(int i = 0; i < n; i ++ )
	{
		int j, k, m;
		cin >> j >> k >> m;
		v[j] = k;
		while(m -- )
		{
			int a;
			cin >> a;
			add(j, a);
			son[a] = true;
		}
	}
	while(son[root])root ++;
	dfs(root);
	cout << min(f[root][1], f[root][2]) << endl;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/194544.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022尚硅谷SSM框架跟学(九)Spring MVC基础四

2022尚硅谷SSM框架跟学 九 Spring MVC基础四14.SpringMVC执行流程14.1SpringMVC常用组件14.2DispatcherServlet初始化过程(Init)(1).初始化WebApplicationContext(2).创建WebApplicationContext(3).DispatcherServlet初始化策略14.3DispatcherServlet调用组件处理请求(Service)…

CentOS环境安装ffmpeg

这是我在网上搜罗的方法&#xff0c;亲测好用 &#xff0c;借此写篇文章&#xff0c;分享给大家。温馨提示&#xff1a;安装ffmpeg过程会很慢&#xff0c;因为它集成的功能太多了&#xff0c;所以在安装过程中不必长时间等待&#xff0c;执行命令后可暂时先去忙别的事&#xff…

Unity URP无法设置Transparency Sort Mode

Unity URP无法设置Transparency Sort Mode问题解决方案参考问题 一般使用Unity制作2D游戏时会将Transparency Sort Mode设置为Custom Axis并将Transparency Sort Axis设置为0,1,0来方便Spirte排序 但是当渲染管线切换为Universal Render Pipeline(通用渲染管线)时 Transpare…

JAVA将百万级数据高效的导出到EXCEL表单

遇到的问题 1.list集合太大&#xff0c;触发oom 2.导出excel数据量太大内存占满&#xff0c;没输出到硬盘前已经出发oom 接下来尝试用poi解决 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version&…

如何在Exchange Online中使用使用反垃圾邮件策略将域列入白名单

将域列入白名单 打开安全门户单击威胁策略单击反垃圾邮件策略单击反垃圾邮件入站策略(默认)单击“允许域”Exchange Online已启用默认的反垃圾邮件策略。策略的名称为Default。不建议使用这些电子邮件,因为它们会使你的组织容易受到来自该域或发件人的欺骗电子邮件的攻击。我…

【环境配置】在Ubuntu中使用Docker20.10.23配置FATE1.10.0(单机部署)

前言 本文讲解了在Ubuntu22中使用Docker20配置FATE1.10.0的方法 分为官方文档与我自己的实际操作两个部分 需要先安装docker&#xff0c;可以看我的上一篇文章 安装流程前言一、FATE单机部署指南&#xff08;官方&#xff09;1. 说明2. 使用Docker镜像安装FATE&#xff08;推荐…

Maven(mvn)基础

Maven&#xff08;mvn&#xff09;基础 文章目录Maven&#xff08;mvn&#xff09;基础传统项目管理状态分析Maven是什么Maven的作用下载与安装1.下载安装2.环境变量配置Maven基础概念仓库坐标本地仓库配置全局setting与用户setting第一个Maven项目(手动)Maven工程目录结构Mave…

蓝桥杯-长草

没有白走的路&#xff0c;每一步都算数&#x1f388;&#x1f388;&#x1f388; 题目描述&#xff1a; 已知一个长度为n&#xff0c;宽度为m的长方形草地&#xff0c;但不是每一个方格里面都长满了草&#xff0c;只有部分的方格张了些草。并且每个月草会向上下左右都繁殖一个…

Linux中MMU内存管理【进阶学习】

前言 现代操作系统普遍采用虚拟内存管理&#xff08;Virtual Memory Management&#xff09;机制&#xff0c;这需要处理器中的MMU&#xff08;Memory Management Unit&#xff0c;内存管理单元&#xff09;提供支持。 MMU&#xff08;Memory Management Unit) &#xff1a;内…

微信小程序023安全科普之家在线考试错题集

开发语言&#xff1a;Java 小程序前端框架&#xff1a;uniapp 小程序运行软件&#xff1a;微信开发者 后端技术:Ssm(SpringSpringMVCMyBatis)vue.js 后端开发环境:idea/eclipse 数据库:mysql 本系统设计的是一个“科普之家”知识在线考试小程序的网站&#xff0c;此网站使用户实…

计算机网络基础知识点

计算机网络基础知识点计算机网络1、概述1.1 计算机网络基本概念1.2 互联网核心部分:数据交换1.3 计算机网络的性能指标1.4 计算机网络体系结构2、物理层2.1 物理层基本概念2.2 数据通信系统模型2.3 数据编码技术2.4 信道复用技术3、数据链路层3.1 概述3.2 PPP协议3.3 CSMA/CD3.…

Python垃圾回收机制——完美讲解

Garbage collection(GC) 现在的高级语言如java&#xff0c;c#等&#xff0c;都采用了垃圾收集机制&#xff0c;而不再是c&#xff0c;c里用户自己管理维护内存的方式。自己管理内存极其自由&#xff0c;可以任意申请内存&#xff0c;但如同一把双刃剑&#xff0c;为大量内存泄…

小程序用ts时点击事件e的类型

今天检查代码的时候发现&#xff0c;小伙伴用ts写的文件里面&#xff0c;点击事件的e都是用any&#xff0c;这明显不对。所以趁着有空&#xff0c;去百度去翻阅资料解决这个问题。 小程序的官方社区下面直接给了答案&#xff0c;如下图&#xff1a; 嗯&#xff0c;是的&#x…

看ChatGPT这形势,留给我们开发人员的时间不多了

程序员一直所做的工作是什么&#xff1f;恐怕想到最后&#xff0c;每个努力的程序员都是在让自己努力的走向失业。最近ChatGPT爆火&#xff0c;他能做什么&#xff1f;能写文章&#xff0c;写的很好&#xff0c;可以代替你发邮件&#xff0c;一直到发现OpenAI的深度加持&#x…

微信小程序 Springboot+vue+nodejs学科竞赛比赛报名管理系统

目 录 摘 要 III Abstract 4 1 系统概述 5 1.1 概述 5 1.2课题意义 5 1.3 主要内容 5 2 系统开发环境 6 2.1微信开发者工具 6 2.2小程序框架以及目录结构介绍 6 2.3 JAVA简介 7 2.4 MySQL数据库 7 3 需求分析 1 3.1 系统设计目标 1 …

实战案例 Python批量识别银行卡号码并且写入Excel,初学者也可以轻松使用~

大家好&#xff0c;这里是恶霸 今天我们继续学习Python自动化办公&#xff1a;每次有新员工入职&#xff0c;都要收集大量的工资卡信息&#xff0c;并且生成Excel文档&#xff0c;能不能用Python准确、快速地解决呢&#xff1f; 今天我们就来学习一下&#xff0c;如何用1行代…

【07】FreeRTOS的列表和列表项

目录 1.列表和列表项的简介 1.1列表结构体成员-介绍 1.2列表项结构层成员-介绍 1.3迷你列表项 1.4列表和列表项的关系 2.列表相关API函数介绍 2.1列表初始化函数vListInitialise() 2.2列表项初始化函数vListInitialiseItem() 2.3列表项插入函数vListInsert() 2.4末尾…

微服务配置中心, 这个方案 Go 里用起来不输SpringCloud

微服务架构设计模式里有一条讲到&#xff0c;要设计可配置的服务。把服务从单体架构细分成微服务后&#xff0c;所有配置属性都集中存储在一个位置&#xff0c;更易于管理。这个集中存储管理配置的地方叫&#xff0c;就是配置中心。 使用配置中心还有一个好处就是&#xff0c;…

java基础面试题 一

一、面向对象五大基本原则是什么 1.单一职责原则SRP(Single Responsibility Principle) 类的功能要单一&#xff0c;不能包罗万象&#xff0c;跟杂货铺似的。 2.开放封闭原则OCP(Open&#xff0d;Close Principle) 一个模块对于扩展是开放的&#xff0c;对于修改是封闭的 …

Jenkins基于docker cloud动态增减节点

jenkins可以按照jenkins容器启动去部署 Jenkins管理动态节点 动态节点可以在有job运行时&#xff0c;临时加入一个agent到jenkins master&#xff0c;然后等job执行完毕之后&#xff0c;所加入的agent再自动删除掉&#xff0c;达到一个动态的增删节点效果&#xff0c;使所有的…