- 博客(83)
- 收藏
- 关注
原创 动态规划套路板子(不算板子)——自己用
也不能算板子吧,自己总结的文章目录1. 树形dp树的最大独立集树的最小支配集树的最小点覆盖树的直径树的重心树的中心依赖背包问题基环树dp换根最长上升子序列朴素动态规划贪心树状数组(或线段树)优化动态规划(直接优化)树状数组(或线段树)优化(将值排序,求下标的最长上升子序列)1. 树形dp树的最大独立集/*Loj 10160每个点都有一个快乐值,子结点和父节点不能同时被选,问你最大的快乐值dp[i][0]表示第i号结点不选时最大的快乐值dp[i][1]表示第i号结点选时的最大的快乐值*/.
2022-01-26 14:36:22
425
原创 狂补dp Atcoder Educational DP Contest(全)
狂补dp Atcoder Educational DP Contest(全)注意为了减少篇幅,本博客代码部分只放主代码部分,其余省略快读、快输、头文件等代码,即把代码看做伪代码更佳A - Frog 1幼儿级别的dp,直接dp便可void problem() { int n = IO(); for (int i = 0; i < n; ++i) num[i] = IO(); for (int i = 1; i < n; ++i) { dp[i]
2021-08-25 22:12:52
2654
原创 树形dp总结
树形dp总结树形背包常用思考模型点这里【例题1】P3177 树上染色已搬出,点这里【例题2】P1272 重建道路已搬出,点这里【例题3】P1273 有线电视网已搬出,点这里
2021-03-26 15:47:35
156
原创 2019ccpc江西省赛补题
文章目录A - Cotree [HDU - 6567](http://acm.hdu.edu.cn/showproblem.php?pid=6567)B - Math [HDU - 6568](http://acm.hdu.edu.cn/showproblem.php?pid=6568)C - Wave [HDU - 6569](http://acm.hdu.edu.cn/showproblem.php?pid=6569)D - Trap [HDU - 6570](http://acm.hdu.edu.cn
2021-03-06 10:35:31
138
原创 Neko and tree - 树上背包问题
思路网上有很多题解貌似对这个dp的状态都没有说清楚,下面尝试说清楚一点:dp[u][len]dp[u][len]dp[u][len]表示以u为根结点的子树中,距离u结点最远为len的一个点必选的的方案数,注意是距离u结点的距离恰好为len的那一群点中,其中选某几个(大于等于1)的总方案数,(这个状态我也不知道为什么要这样定义,反正我是想不到的)则转移可以由组合数学的思想来进行转移dp[u][max(i,j+1)]=dp[u][i]+dp[u][i]×dp[son][j]dp[u][max(i,.
2021-03-01 20:55:01
189
原创 有线电视网 - 树上背包
思路这题想了好久,唯一想到比较有用的就是假设dp[u][j]dp[u][j]dp[u][j]表示以u为根结点的子树花费j元最多可以提供多少用户,然后就没有然后了,都不知道怎么转移,看了学长巨巨的思路后发现新大陆,原来还可以利用换意的方式进行dp,即转台这样定义:dp[u][i]dp[u][i]dp[u][i]表示以u为根结点的子树提供j个用户最多能赚多少钱,这样转移又方便,最后的答案就是dp[1][i]dp[1][i]dp[1][i]中大于等于0的最大i转移方程:dp[u][i]=max{dp[s.
2021-03-01 12:48:24
118
原创 重建道路 - 树上背包
思路根据树上背包模型可以想到状态定义:dp[u][i]dp[u][i]dp[u][i]表示以u结点为根结点的子树生成只有i个结点的最少去掉的边数,转移方程如下:dp[u][i]=max{dp[son][j]+dp[u][i−j]}dp[u][i] = max\{ dp[son][j] + dp[u][i - j]\}dp[u][i]=max{dp[son][j]+dp[u][i−j]}和树上染色那题一样,需要i−ji - ji−j必须合法即必须不超过它自己的结点数才能转移且大于0,注意:转移还.
2021-03-01 12:32:32
162
原创 树上染色 - 树上背包
思路一道树形dp题,想了好久,最终看了题解发现是突破口不对突破口:首先思考怎么求一条边被算过的次数,用组合数学方法思考可以想到就是这条边两个方向(定义一个左边,一个右边)的黑点个数的乘积 + 白点个数的乘积假设左边黑点的个数是x,且其左边节点个数是size, 树的总结点个数为n,则这条边计算次数有下面的公式tot=x×(k−x)+(size−x)×(n−size−k+x)tot = x \times (k - x) + (size - x) \times (n - size - k + x).
2021-03-01 12:15:22
139
原创 树形背包思考模型
树形背包常用思考模型模型一首先对于每个节点我们在dfs中dp转移时可以想象成一个分组背包,每次新遍历一个子树就可以想象成一个分组背包的下一组,转移时利用之前的背包状态进行转移,如果觉得这个模型比较难理解可以看下面的模型二模型二首先对于每次新遍历一个结点我们都可以想象成是在给这个结点拼接一颗子树如下图解释:圆点为树的结点,三角形为一颗子树,线段为边,箭头是拼接方向。蓝色为之前计算好的状态的树,红色为即将拼接上去的一颗子树(这颗子树在dfs时计算好了所有状态)模型一与模型二的联系回到模型
2021-03-01 11:53:00
451
1
原创 div2 cf1478 C - Nezzar and Symmetric Array
题意定义对称数组:若数组a中任意aia_iai在a中都有ai=−aja_i = -a_jai=−aj,例如{−1,−2,−3,1,2,3}\{-1, -2,-3,1,2,3\}{−1,−2,−3,1,2,3}给你一个长度为2n2n2n的数组d,是否存在一个对称数组a使得di=∑j=12n∣ai−aj∣d_i = \sum_{j = 1}^{2n}{|a_i - a_j|}di=∑j=12n∣ai−aj∣若存在输出YES,否则输出NO思路抽象出这么一个对称数组在数轴上不难
2021-01-29 12:56:01
145
原创 UVA1625 Color Length(动态规划LCS)
本题Vjudge链接题意:给你两个长度分别为n、m(1≤n,m≤5000)n、m(1 \le n, m \le 5000)n、m(1≤n,m≤5000)的字符串,让你求出组成新串的最小l(c)l(c)l(c)(具体组成方式看原题)个人感觉这题很难,一度怀疑自己的能力和紫书题目的难易分布,最后费了九牛二虎之力终于想通为什么了,所以本文可能会花大篇幅来解释这题是怎么想的思路:一开始看着有点LCS的影子,想着想着就写出了DP的递归函数,但是却死活想不出下一步怎么递归,即如下代码的[][][]片段int
2020-09-10 17:59:59
213
原创 UVA11584 Partitioning by Palindromes(动态规划)
本题vjudge链接题意:给你一个字符串,让你求分割成最少回文串的数量,比如racecar最少就是1,fastcar就是7,aaadbccb就是3思路:说实话,不放到动态规划的专题我可能都不知道怎么做提供一种比较好想的思路:记一个长度为lll的字符串最大的分割数量就是lll,如果说第lll个字符和第l−1l - 1l−1个字符拼成的字符串是回文串,则分割数量就可以减少,即将l−1l - 1l−1 ~ lll的字符串看成一个字符,固分割数减一,以此类推往前找能够看成单个字符的回文串来求出长度
2020-08-31 19:53:10
154
原创 UVA11400 Lighting System Design(动态规划)
本题vjudge链接题意:你要设计一个一共需要n种不同电压灯泡的照明系统,不同种类的灯泡用不同的电源,同一种灯泡必须要用同一个电源,现在为了省钱,在亮度不减的前提下,可以用电压高的灯泡来换电压低的灯泡减小费用,现给你每种灯泡的电压V,电源费用K,每个灯泡的费用C,每种灯泡所需要的数量L,问你计算出最优的方案的费用思路:为了减少电压之间的比较可以对灯泡进行从小到大的排序,这样的话就可以默认是下标大的换下标小的注意到对于一种灯泡,要不就全换掉,要不就全部都不换,不可能说最优的方案是当前这种灯泡
2020-08-31 19:51:15
183
原创 背包问题总结
本文从dp总结中搬出背包问题是一类非常经典的动规问题,包括了完全背包、01背包、多重背包、分组背包、混合背包、二维费用背包、背包问题求方案数、求背包问题的方案、有依赖的背包问题(称为背包九讲)01背包最最经典的背包问题,背包九讲中说到:“它包含了背包问题中设计状态、方程的最基本思想。另外,别的类型的背包问题往往也可以转换成01 背包问题求解。”,固01背包的模型是非常重要的直接看到最原汁原味的题【例题1】AcWing 2. 01背包问题题意不多说,就是原汁原味的01背包题,值得说的是
2020-08-23 18:29:52
381
原创 UVA1025 A Spy in the Metro(动态规划)
本题vjudge链接本篇是由DP总结中搬出的,目的是记录刷题进度大致题意:一个线性的地铁,有n(2≤n≤50)n(2 \le n \le 50)n(2≤n≤50)个站,目标是在T(0≤T≤200)T(0 \le T \le 200)T(0≤T≤200)时刻从1号站到n号站,注是规定刚好T时刻,不是在T时刻之前也不是在T时刻之后,从1号点出发,可以在途中转乘,问你最少的中途等车时间第i站到第i + 1站需要花的时间为tit_iti有M1(M1≤50)M1(M1 \le 50)M1(M1≤50)个
2020-08-21 21:50:07
147
原创 UVA116 Unidirectional TSP(动态规划)
本题vjudge链接大致题意:有个m×nm \times nm×n矩阵,对于每个点你可以向直接向右、右上,右下走,第1行的上一行是第m行,第m行的下一行是第1行,问你从第一列的某一行出发,到达最后一列所经历的点的和最小是多少,并且打印出每一列的行号,如果有多解,输出字典序最小的简单的分析:可以看出是一个数塔问题的变种书中说这种问题叫做多阶段决策问题中的一类——多阶段图的最短路问题,所谓多阶段图按书中说法就是图中结点可以划分成若干个阶段这里我的理解就是原数塔问题也可以说是一个DAG,而这题
2020-08-21 21:48:57
172
原创 UVA437 The Tower of Babylon(动态规划)
本题vjudge链接题意:给你n种有无数个的立方体,现在让你用这些立方体堆一个塔,每个立方体的底面长宽都要严格小于下面立方体的底面长宽,问你最高能堆多高简单的分析能看得出来是一个矩形嵌套的变种问题,用DAG模型建立来做会非常好码代码一种立方体有三种摆放方式,假设一个立方体的长宽高为a、b、c,则三种摆放方式分别是以a、b、c为高的摆放方式,固一种立方体可以看成三个立方体下面就是建立DAG了,如果一个立方体的底面长宽严格大于另一个底面长宽的立方体则连一条有向边过去最后就DP就是求从某个节点出发
2020-08-21 21:47:34
106
原创 UVA12563 Jin Ge Jin Qu hao(01背包)
本题vjudge链接大致题意:在KTV里,如果还剩下1秒的时间,则可以点一首更长的歌,因为他会播放完最后一首歌才停止,现在给你剩下的时间mmm和n(n≤50)n(n \le 50)n(n≤50)首歌,每首歌的时长t1,t2,t3……tnt_1, t_2, t_3 ……t_nt1,t2,t3……tn,现让你算出在剩余的时间内能唱的歌的最大数量,然后利用空出来的时间最后再点一首长为678秒的歌,输出能唱的最大数量,对应的时间简单的分析:题目中说最后会点一首678秒的歌来延长时间,则策略就是计算
2020-08-21 21:42:47
115
原创 UVA11572 Unique Snowflakes(思维 )
本vjudge链接题意:给你一个长度为n(n≤1000000)n(n \le 1000000)n(n≤1000000)的数组,问你最长有不重复数字的连续子序列有多长用set和map的速度都差不多,set记录是否重复,map记录当前数字在此之前最近出现的位置,如果没有就是-1如果嫌set和map慢的话直接用unordered_set或者unordered_map这里用了上次偶遇了一种很牛逼很简洁的hash方式后就喜欢上这个hash,跑进了100ms代码如下#include <cstdio
2020-08-21 21:40:23
117
原创 UVA1149 Bin Packing(贪心)
本题vjudge链接题意:给你n个物品,每个物品的重量为wiw_iwi,你有容量为w的背包,每个背包最多只能装两件物品,问你最少要多少背包来装贪心就好了,贪心策略:将物品按重量排序,如果最重和最轻的物品一起不超过w就放一起,然后就让次重和次轻的放一起;否则重的单独放在一个背包,然后让次重的背包和最轻的一起,以此循环代码如下#include <cstdio>#include <cstring>#include <algorithm>using name
2020-08-21 21:40:01
190
原创 UVA11054 Wine trading in Gergovia(思维)
本vjudge链接题意:有n个村庄,每个村庄都有对酒的需求,正数代表要送出多少酒,负数代表需要多少酒,把k单位的酒运到相邻的村庄要k单位的体力,让你计算最小需要的体力对于第一个村庄,他的需求量x无论正负,都需要右边的村庄搬过来或者搬过去右边的村庄,然后把多余的需求继承到下一个村庄,和紫书上讲的思想差不多代码如下#include <cstdio>#include <cstring>#include <algorithm>#include <cmath
2020-08-21 21:39:22
132
原创 UVA120 Stacks of Flapjacks(思维)
title: “UVA120”date: 2020-08-17T11:16:52+08:00draft: truecategories: [“紫书刷题录-ch8”]tags: [“题解”, “思维”]description: “description.”本题vjudge链接题意:给你一个序列,每次选一个数k,从序列的后往前数第k个数然后把它及它之前时数都翻转一下,问你一种选法使得序列从小到大排好序有点像选择排序,不过为了不影响后面的,应该先把排好最大的数,如果已经就位就排第二大的数,具体.
2020-08-17 20:43:45
151
原创 UVA1605 Building for UN(思维)
title: “UVA1605”date: 2020-08-17T11:43:31+08:00draft: truecategories: [“紫书刷题录-ch8”]tags: [“题解”, “思维”]description: “description.”本题vjudge链接题意:有一栋楼,有n(n≤50)n(n \le 50)n(n≤50)个国家要开会,每个国家至少分配一个位置,让你输出一种方案,H层,每层W行L列,使得任意两个国家要能相邻,层数也算相邻按紫书说的构造一种解出来,只需要.
2020-08-17 20:41:58
165
原创 UVA1152 4 Values whose Sum is 0(思维 + 哈希)
本题vjudge链接题意:给你4个长度为n(n≤4000)n(n \le 4000)n(n≤4000)的集合,让你在4个集合里分别取a、b、c、d,使得a+b+c+d=0a + b + c + d = 0a+b+c+d=0,问你有多少种取法按紫书说的“中途相遇法”,从象个不同的方向来解决问题,最终“汇集”在一起用哈希记录a+ba + ba+b,然后再计算−c−d-c - d−c−d的哈希个数就好了,用slt提供的unordered_map足够过这题了,跑了6000ms多,a掉了后来看了一位大佬自己
2020-08-17 20:40:05
166
原创 UVA12113 Overlapping Squares(DFS + 回溯)
Overlapping Squares题意:给你个4×44 \times 44×4的网格图,问你有没有可能用不超过6张2×22 \times 22×2的纸叠成给的样子一开始想破脑袋都想不出来应该怎么验证是否相同,没办法还是问了下度娘,知道思路后自己写了代码ac了想不出的是如何验证正确性,一开始想着是否要把被遮住的部分补全然后验证,但这样又怎么验证?看了看别人的思路发现自己是真的蠢,直接模拟用2×22 \times 22×2的纸一张一张地放上去不就好了吗dfs最多也就6层,纸放下去只有9种可能,能想
2020-08-16 21:55:24
149
原创 UVA12558 Egyptian Fractions (HARD version)(IDA*)
本题vjudge链接题意:埃及分数问题困难版,问你一个真分数a/ba/ba/b,在表达成a/b=1/c+1/d……a/b = 1/c + 1/d ……a/b=1/c+1/d……,选的分数尽量少,相同情况下自小的分数尽量大,限制有k(k≤5)k(k \le 5)k(k≤5)个数不能用来做分母,让你求解思路,IDA*的经典题,和普通埃及分数差不多的写法,就是要加一个限制,即有些数不能用一开始写了一个分数的结构体,后来发现没必要,直接IDA*就好了注意几个剪枝的地方,到达目标层时判断分子是否为1
2020-08-16 21:54:55
122
原创 UVA225 Golygons(DFS + 回溯)
本题vjudge链接题意:一个网格图,现在给你图中k(k≤50)k(k \le 50)k(k≤50)个障碍的坐标(坐标可能为负),不能继续上次的方向继续走也不能后退,这就意味着只能左右走,第iii次走iii个单位,从(0, 0)点出发,走了n(n≤20)n(n \le 20)n(n≤20)次恰好回到(0, 0)点,让你输出所有可能的路线,按字典序输出因为深度已知,所以我才用了DFS的方法,考虑到坐标可能有负数,所以我把坐标原点移动了一下,将(1000, 1000)记为原点,其余点也一样有同样变化,因为
2020-08-15 15:43:10
153
原创 UVA208 Firetruck(DFS + 回溯)
title: “UVA208”date: 2020-08-12T10:24:20+08:00draft: truecategories: [“紫书刷题录-ch7”]tags: [“题解”, “DFS”, “回溯”]description: “description.”本题vjudge链接题意:给你一个无向图,让你求出从1号节点到n号节点的所有路径,按顺序输出,具体看样例DFS和BFS都可以,这里我用了DFS,利用了一个ans的vector数组来储存答案,根据题目要求,优先递归节点权值小的.
2020-08-15 15:42:50
177
原创 UVA211 The Domino Effect(DFS + 回溯)
title: “UVA211”date: 2020-08-13T14:46:51+08:00draft: truecategories: [“紫书刷题录-ch7”]tags: [“题解”, “DFS”, “回溯”]description: “description.”本题vjudge链接题意:一个多米诺骨牌有两个面,一共有28个不同的多米诺骨牌,放在那,可能横着,可能竖着,这样就形成了一个7×87 \times 87×8的一个数字图,问你所有可能的摆放方式dfs就好了,一开始没想到怎么d.
2020-08-15 15:42:24
166
原创 UVA690 Pipeline Scheduling(DFS + 回溯)
本题vjudge链接历经千辛万苦终于a了这题题意:一台电脑有5个工作单元(unit0 ~ unit4),有10(0 ~ 9)个程序需要完成,每个程序都要在n(n<20>)(n < 20>)(n<20>)的时间片完成,在同一时间里,一个单元只能执行一个程序,开始执行后就要严格按顺序执行完,问你最小的完成10个程序的时间是多少从读题到思考到ac用了近两天,下面我将会从运行时间慢到运行时间快,tle到ac开始阐释解决这题时的坎坷首先是这题怎么dfs一开始想的时候想
2020-08-15 15:42:02
167
原创 Cosmic_Tables(模拟 + 思维)
传送门题意:给你一个矩阵,每次进行与行之间的交换,或者是列与列之间的交换,或者查询(x, y)点的值思路:一开始想着是不是直接就纯模拟算了,后来想想,直接用数组把行和列也记录下来不就好了吗代码如下#include <cstdio>using namespace std;const int M = 1e3 + 10;int r[M], c[M], g[M][M], n, m, k;int main() {#ifndef ONLINE_JUDGE freopen(
2020-08-15 15:41:38
157
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人