首页 > 编程语言 >【算法进阶课】动态规划笔记

【算法进阶课】动态规划笔记

时间:2023-09-15 20:00:18浏览次数:51  
标签:方案 进阶 不选 笔记 儿子 基环树 算法 DP 环上

基环树DP

一些基本概念:

在一棵树上加一条边,就会构成一个环,环上会挂着一些子树。

基环树是只有一个环的仙人掌。

如果基环树的边是有向边,环上的点是p1, p2, p3, ...
则环上的边是p1->p2, p2->p3, ..., pn->p1 或者全部反过来

总之就是环上的边要么全部逆时针要么全部顺时针。

对于挂在环上的子树,如果边从环上的点指向自己,那么这棵树就是外向树;
如果从自己指向环上的点,那么这棵树就是内向树。

由若干棵基环树构成的森林,就是基环树森林。

由若干棵内向树构成的森林,就是内向树森林。

由若干棵外向树构成的森林,就是外向树森林。

一些结论:

  1. 基环树有n个点,n条边,即基环树的边数等于点数。(一个图有n个点,n条边,不一定是基环树,因为图不一定连通)

  2. 基环树(森林)的判定:每个点x都有一条从x出发的边或者有一条到x的边(有向图);每个点都连了一条到其它点的边(无向图)。


思路1:断开环上的一条边u->v,使之成为一棵树。

  • u->v限制了点的状态。

强制在树形DP的过程中,将被限制了状态(比如是x)的点的状态限制(比如限制成x)。

这样子DP所囊括的所有方案,加上这条边之后,都是满足边u->v的限制的,都一一对应了一个原图中、被u->v限制的方案。

  • u->v对于点的状态没有限制。

将这条边删去之后的图,没有这条边,自然也就没有这条边的限制,直接做一遍树形DP即可。

思路2:讨论方案是否经过了环上的点。

  • 没有经过环上的点。

对挂在环上的树分别做一次树形DP,就可以求得答案了。

  • 经过了环上的点,这时可以将方案分为:挂在环上的树1、环的一部分、挂在环上的树2。

树1和树2可以用树形DP先预处理好,对于环上的一部分,破环成链(就是倍增一次区间)。

然后对于这个区间做DP就行了,接着就是运用线性DP的一些常见套路,比如单调队列优化啥的。


总的来说,就是先考虑这个问题在树上的做法,然后扩展到基环树的情况。

找环一般用Tarjan。


  • 358. 岛屿 思路1难以优化复杂度,考虑思路2。路径没有经过环,就是求树的直径;经过了环,将环上的路径记为从x顺时针走到y,因为要最大值,所以这种情况就是dist(x,y)+d(x)+d(y)d(x)表示x往子树走最大的路径。对于dist(x,y),本来是要取较大的半圈,但是如果x顺时针到y是较小的半圈,当枚举到x2=y,y2=x时,就可以枚举到较大半圈的情况了,所以不需要特殊处理。

  • 1080. 骑士 思路1就行了,实现细节看这里

  • 359. 创世纪 同样用思路1即可。这里有一个细节:至少有一个儿子不选,可以转化成有一个儿子一定不选(其它儿子随意)。

这是为什么呢?至少有一个儿子不选的方案,随便将一个没选的儿子作为一定不选,都是有一个儿子一定不选的一种方案。

有一个儿子一定不选的方案,那么至少有一个儿子没选,就是至少有一个儿子不选的方案。

也就是A:至少有一个儿子不选,B:有一个儿子一定不选。

每个A方案都对应了若干了B方案(具体来说,A中没选的儿子数为x,则对应x个B方案),每个B方案对应了唯一的A方案。

需要统计的答案是选中的节点数,所以同一A方案对应的所有B方案的答案都是一样的,对于需要统计的答案,AB是等价的。

也就是1 2 31 1 1 1 2 2 2 3 3 3 3的值域都是一致的。

所以可以这样转化。


注意事项:内向树一般要建反边转成外向树(这样才能遍历到所有点),此时要根据题意得出反转后的边的意义。

标签:方案,进阶,不选,笔记,儿子,基环树,算法,DP,环上
From: https://www.cnblogs.com/zhangchenxin/p/17705822.html

相关文章

  • 3 - 任务调度算法 & 同步与互斥 &队列
    之前的都是按照优先级不同允许抢占(不讲道理),不管你在做什么,轮到优先级最高的任务,直接抢占执行怎样才能讲道理呢?稍微等等嘛,等我做完活你再做 1支持抢占,0不支持抢占 同优先级任务是否交替执行,1交替0不交 空闲任务是否礼让其他任务礼让的话,自己的函数逻辑在时间片内只执行......
  • Kruskal重构树 学习笔记
    Kruskal重构树最大生成树将部分内容倒置即可回顾:Kruskal基本信息求解最小生成树时间复杂度:\(O(m\logm)\)更适合稀疏图算法思想按照边权从小到大排序依次枚举每一条边,如果这一条边两侧不连通,则加入这条边代码点击查看代码#include<bits/stdc++.h>#define......
  • 《信息安全系统设计与实现》第二周学习笔记
    《信息安全系统设计与实现》第二周学习笔记第九章I/O库函数系统调用系统调用函数open()read()write()lseek()close()I/O库函数fopen()fread()fwrite()fseek()fclose()I/O库函数的算法fread算法:第一次调用fread()时候,FILE结构体的缓冲区时空的,fread(......
  • 3dmax自用快捷键笔记
    3dmax自用快捷键笔记G隐藏或显示网格ALT+W全屏模式ALT+Q独立显示ALT+X物体透明显示W移动Z找回物体缩放模式(大化)CTRL+Z撤回(最多撤回9步)F1帮助文件F3线框显示F4明暗处理+边面M材质编辑器J框显示切换A角度捕捉S......
  • 【代码随想录算法训练营第二天】977.有序数组的平方、209.长度最小的子数组 、59.螺旋
    Day2-数组2023.9.15Leetcode977有序数组的平方给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。初解我还是不能想到暴力解法之外的,对某个问题的最优复杂度也没有概念。就算提示我是用指针,我也想不到思路。现在我知......
  • 浅析安防监控/AI视频智能分析算法:河道水位超标算法应用
    传统的水位水尺刻度尺位监测中,所采用的人工读数方式,效率较为低下且人工成本较高,不利于作业流程的数字化。尽管感应器检测会自动对水位的模拟输入进行筛选,但是由于成本、使用场景要求高、后续日常维护复杂等多种因素,在一些场景下没法合理应用。TSINGSEE青犀智能分析AI算法中台——......
  • Qemu源码分析(2)—Apple的学习笔记
    一,前言最近从main开始看了opt参数相关的解析,这个比较简单我就不写了,然后当时我搞不清楚的是MachineClass和TypeImpl类的关系。本节主要分析的其实就是分析machine_class怎么来的,其实也就是machine_class=select_machine();二,源码分析关于mc的来历type_initialize中ti->class->ty......
  • 安防监控/视频云存储/视频AI智能分析:人形检测算法应用汇总
    随着人工智能的飞速发展,TSINGSEE青犀智能AI算法功能也日渐丰富,除了常见的人脸、工服、安全帽检测以外,人形检测算法的应用也十分广泛,主要可以应用在以下场景:1、安防监控系统人形检测算法可以应用于监控摄像头中,实时检测和跟踪人体目标。当有可疑人员进入监控区域时,系统可以自动发出......
  • FATs文件系统笔记
    1.设备状态获取点击查看代码DSTATUSdisk_status(BYTEpdrv/*物理编号*/){DSTATUSstatus=STA_NOINIT;switch(pdrv){caseATA:/*SDCARD*/break;caseSPI_FLASH:/*SPIFlash状态检测:读取SPIFlash设备ID*/......
  • 浅析安防监控系统/AI视频智能分析算法:河道水文水位超标算法应用
    传统的水位水尺刻度尺位监测中,所采用的人工读数方式,效率较为低下且人工成本较高,不利于作业流程的数字化。尽管感应器检测会自动对水位的模拟输入进行筛选,但是由于成本、使用场景要求高、后续日常维护复杂等多种因素,在一些场景下没法合理应用。TSINGSEE青犀智能分析AI算法中台......