AcWing 323. 战略游戏(树形DP + 状态机DP)

news2024/12/23 3:14:31

AcWing 323. 战略游戏(树形DP + 状态机DP)

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

一、问题

在这里插入图片描述

二、分析

1、思路分析

这道题最后问的其实就是,在一棵树中,每个边至少选择一个端点的条件下,我们最少能选择几个端点。

我们以一条边为例子, 两边的端点标号为A 和 B。那么如果A没选的话,B一定选。如果A选了的话,B可以选也可以不选。

如果我们把A和B看作两个物品的话,就会发现A选不选影响到了我们对B的选择。

那么我们就需要把A拿出来分类讨论,这个思路叫做状态机DP。

如果大家对状态机模型不太了解,或者想要深入全面地学习状态机模型的话,可以看作者在算法专栏中写的文章:第四十六章 动态规划——状态机模型

2、状态表示

f [ u ] [ j ] f[u][j] f[u][j]表示以 u u u为根节点的树中选,其中根节点 u u u的状态是 j j j的条件下,并且保证每条边至少选择一个点时,最少选择的点的数目。

3、状态转移

1表示选根节点,0表示不选根节点。
f [ u ] [ 1 ] = ∑ m i n ( f [ s o n ] [ 1 ] , f [ s o n ] [ 0 ] ) f [ u ] [ 0 ] = ∑ f [ s o n ] [ 1 ] f[u][1] = \sum min(f[son][1],f[son][0]) \\ f[u][0]=\sum f[son][1] f[u][1]=min(f[son][1],f[son][0])f[u][0]=f[son][1]

4、循环设计

我们需要遍历整个树,所以之前原本的for循环,由于数据结构的变化,我们需要用DFS代替。

5、初末状态

f [ u ] [ 1 ] = 1 f[u][1] = 1 f[u][1]=1
因为我们选上了根节点,所以我们至少选一个。

最终的结果是: m i n ( f [ r o o t ] [ 0 ] , f [ r o o t ] [ 1 ] ) min(f[root][0], f[root][1]) min(f[root][0],f[root][1])

三、代码

由于我们是从根节点开始找,所以我们需要寻找根节点。因此,我们需要对子节点进行标记,最后没被标记的就是根节点。为了记录这些标记,我们可以开一个数组:bool not_root[N];

#include<bits/stdc++.h>
using namespace std;
const int N = 1510;
int n;
int h[N], e[N], ne[N], idx;
int f[N][2];
bool not_root[N];
void add(int a, int b)
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}
void dfs(int u)
{
    f[u][1] = 1, f[u][0] = 0;
    for(int i = h[u]; i != -1; i = ne[i])
    {
        int j = e[i];
        dfs(j);
        f[u][1] = f[u][1] + min(f[j][1], f[j][0]);
        f[u][0] = f[u][0] + f[j][1];
    }
}
int main()
{
    while (~scanf("%d", &n))
    {
        memset(h, -1, sizeof h); idx = 0;
        memset(not_root, 0, sizeof not_root);
        for (int i = 0; i < n; i ++ )
        {
            int a, b, siz;
            scanf("%d:(%d) ", &a, &siz);
            while (siz -- )
            {
                scanf("%d", &b);
                add(a, b);
                not_root[b] = true;
            }
        }
        int root = 0;
        while (not_root[root]) root ++ ;
        dfs(root);
        printf("%d\n", min(f[root][0], f[root][1]));
    }
    return 0;
}

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

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

相关文章

【FLASH存储器系列十五】NAND Flash究竟能不能随机读写到某个字节的数据?

网上有很多文章写道&#xff0c;nand flash的读写操作是以page为单位&#xff0c;还有文章说些nand flash时必须按page0、page1、page2…的顺序写&#xff0c;必须先写完前面的page才能写后面的page。难道nandflash就不能随机读到某个字节吗&#xff1f;只能一次性读一页&#…

区区几行代码,就能全面实现 Python 自动探索性数据分析

探索性数据分析是数据科学模型开发和数据集研究的重要组成部分之一。在拿到一个新数据集时首先就需要花费大量时间进行EDA来研究数据集中内在的信息。自动化的EDA Python包可以用几行Python代码执行EDA。 在本文中整理了10个可以自动执行EDA并生成有关数据的见解的Python包&am…

C语言——二分查找与猜数字游戏

文章目录二分查找二分查找的思想二分查找的条件二分查找的实现过程代码举例猜数字游戏游戏说明猜数字游戏思想代码实现打印菜单打印主函数打印游戏函数整体代码演示二分查找 题目&#xff1a; 在一个有序数组中查找具体的某个数字n。 首先我们先定义一个110的数组 &#xff0c;…

immersive-translate(沉浸式双语网页翻译扩展),解决谷歌翻译无法使用问题

前言 谷歌停止了大陆的谷歌翻译服务&#xff0c;所以找到了immersive-translate 插件解决翻译问题。当然 最直接就是 换个浏览器比如 Edge\Firefox等等。 主要特性 智能识别网页主内容区&#xff0c;区别于同类插件翻译网页所有的区域&#xff0c;这可以极大增强译文的阅读…

【C++11】右值引用与移动构造、万能引用与完美转发

目录 一、右值引用 1.1 左值引用和右值引用 1.2 左值引用与右值引用比较 1.3 右值引用的使用场景和意义 二、移动构造 2.1 移动构造的实现 2.2 移动赋值 2.3 默认成员函数 2.4 default关键字 2.5 delete 关键字 2.6 STL中的移动构造 二、完美转发 2.1 模板中的万能…

利用剪枝降低bfs算法的时空复杂度(一道OJ题目)

作者&#xff1a;非妃是公主 专栏&#xff1a;《算法》《刷题笔记》 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 《算法》专栏系列文章 算法设计与分析复习01&#xff1a;主方法求递归算法时间复杂度 算法设计与分析…

我写了一个脚本,实现了图片分类问题的全自动化训练

众所周知,图片分类问题属于计算机视觉中比较容易解决的问题之一 但 这几天被数据集的问题搞得焦头烂额, 照理说分类问题的数据集应该比较好制作 但 如果之前没有现成的数据集 也会变得比较麻烦 直到我偶然发现了一个HuggingFace的图片搜索API 无限次调用 而且不需要身份验证 真…

【手撕面试题】HTML+CSS(高频知识点一)

目录 面试官&#xff1a;给定一个元素&#xff0c;如何实现水平垂直居中&#xff1f; 面试官&#xff1a;padding与margin有什么不同&#xff1f; 面试官&#xff1a;vw和百分比有什么区别&#xff1f; 面试官&#xff1a;行内元素与块级元素有什么区别&#xff1f; 面试官…

MapReduce实现TopN

目录 1、先导知识 2、案例 2.1 需求 2.2 代码实现 FlowBean类 Mapper类 Reducer类 Driver类 3、总结 1、先导知识 TreeMap底层是根据红黑树的数据结构构建的&#xff0c;默认是根据key的自然排序来组织&#xff08;比如integer的大小&#xff0c;String的字典排序&…

一刷代码随想录——回溯算法

1.理论基础【1】本质回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。回溯是递归的副产品&#xff0c;只要有递归就会有回溯。因为回溯的本质是穷举&#xff0c;穷举所有可能&#xff0c;然后选出我们想要的答案&#xff0c;如果想让回溯法高效一些&#xff0c;可以…

线性DP与真题

目录 一、前言 二、最长公共子序列&#xff08;lanqiaoOJ题号1189&#xff0c;类似于1054&#xff09; 三、最长递增子序列 1、蓝桥骑士&#xff08;lanqiaoOJ题号1188&#xff09; 四、编辑距离 1、字符串转换&#xff08;lanqiaoOJ题号1507&#xff09; 五、网络图上的…

JavaScript两数之和

两数之和 两层for循环 // O(n^2) const twoNum function(nums,target){for(let i 0;i<nums.length;i){for(let ji1 ;j<nums.length;j){if(nums[i]nums[j]target){return[i,j]}}} }双指针 // 当数组为有序的时候O(n) const twoNum2 function(nums,target){let i 0 …

SpringCloud学习

由于Spring Cloud基于Spring Boot构建&#xff0c;而Spring Cloud Alibaba又基于Spring Cloud Common的规范实现&#xff0c;所以当我们使用Spring Cloud Alibaba来构建微服务应用的时候&#xff0c;需要知道这三者之间的版本关系。 目前Spring Cloud Alibaba的版本与Spring Bo…

1-1MySql复习

MySql复习 一 数据类型 数值 字符串 ​ char(5) 定长字符串 varchar(5) 可变长度字符串 日期 ​ timestamp 记录行数据的最后修改事件 二 基本查询 1 聚合函数 avg count sum max min 2 排序 order by ​ asc ​ desc 3 分组 group by … having … 分组通常跟…

Python语言的重要性(模式识别与图像处理课程作业)

Python语言的重要性&#xff08;模式识别与图像处理课程作业&#xff09;Python语言的重要性1 Python的优点主要有&#xff1a;1.1、简单1.2、易学1.3、速度快1.4、免费1.5、高层语言1.6、解释性1.7、面向对象1.8、可扩展性1.9、可嵌入性1.10、丰富的库1.11、规范的代码2 Pytho…

TCP/IP网络编程——套接字的多种可选项

完整版文章请参考&#xff1a; TCP/IP网络编程完整版文章 文章目录第 9 章 套接字的多种可选项9.1 套接字可选项和 I/O 缓冲大小9.1.1 套接字多种可选项9.1.2 getsockopt & setsockopt9.1.3 SO_SNDBUF & SO_RCVBUF9.2 SO_REUSEADDR9.2.1 发生地址分配错误&#xff08;B…

高效学 C++|编程实例之计算器

本节将实现一个能进行实数间加、减、乘、除运算的简易计算器。首先创建一个基于QWidget带界面的Qt项目&#xff0c;然后按照如下步骤进行操作&#xff1a; 01、计算器界面设计 在界面中拖入两个单行文本框和十七个按钮&#xff0c;按钮上显示的文字、按钮对象和单行文本框对象…

百分百拿捏offer的自动化测试面试题全套教程

最近很多咨询我&#xff0c;有没有软件测试方面的面试题&#xff0c;尤其是Python自动化测试相关的最新面试题&#xff0c;所以今天给大家整理了一份&#xff0c;希望能帮助到你们。 接口测试基础 1、公司接口测试流程是什么&#xff1f; 从开发那边获取接口设计文档、分析接口…

VUE3 指令 插槽

指令 指令是 Vue 模板语法里的特殊标记&#xff0c;在使用上和 HTML 的 data-* 属性十分相似&#xff0c;统一以 v- 开头&#xff08; e.g. v-html &#xff09;。 它以简单的方式实现了常用的 JavaScript 表达式功能&#xff0c;当表达式的值改变的时候&#xff0c;响应式地…

1x1卷积、Inception网络

目录1.1x1卷积(1x1 convolution)又称网络中的网络(network in network)池化层只能压缩图像的宽和高&#xff0c;1x1卷积能压缩通道数量&#xff0c;减少计算成本。如上图&#xff0c;输入维度的通道数为192&#xff0c;用32个1x1x192的filters&#xff0c;就能将输出的通道数压…