随笔分类 -  动态规划

摘要:https://atcoder.jp/contests/abc271/tasks/abc271_g 题目的思路为: 构建dp矩阵,dp[i][j][k]表示开始前停在j,结束后停在k,且停下时恰好出现2^i次访问的概率 则dp[i]=dp[i-1]*dp[i-1] (矩阵乘法的中间过程模拟的就是两个 阅读全文
posted @ 2022-10-04 23:39 80k 阅读(40) 评论(0) 推荐(0) 编辑
摘要:题目: https://www.codechef.com/submit/MAKEIT1?tab=statement 题解: https://www.codechef.com/submit/ROCKET_PACK?tab=solution 代码: #include<bits/stdc++.h> #in 阅读全文
posted @ 2022-08-25 18:28 80k 阅读(19) 评论(0) 推荐(0) 编辑
摘要:状态压缩dp的时间复杂度一般时O(n*2^m) 可以将2^m优化为2^(m/2) 具体看例题: 牛客网小白月赛53 F. Freezing https://ac.nowcoder.com/acm/contest/11230/F dp[hi][li]数组的状态定义为,高8位为hi,低8位与li没有交集 阅读全文
posted @ 2022-07-12 09:48 80k 阅读(23) 评论(0) 推荐(0) 编辑
摘要:单调队列可以求出,区间内的最值。 对于二维的情况,可以先在每一行,用单调队列求出,行方向上的最值。 然后在行方向上的最值的基础上,在每一列,用单调队列求出列方向上的最值。 即可得到二维区间的最值。 例题: 1091. 理想的正方形 代码: #include<bits/stdc++.h> using 阅读全文
posted @ 2022-07-03 20:48 80k 阅读(26) 评论(0) 推荐(0) 编辑
摘要:AcWing 1086. 恨7不成妻 数位dp例题 注意一个数不能分别对两个不同的数取余,只能将其保存下来 例如下面代码中的prev_b #include<bits/stdc++.h> using namespace std; typedef long long LL; LL MOD = 10000 阅读全文
posted @ 2022-06-24 16:15 80k 阅读(37) 评论(0) 推荐(0) 编辑
摘要:若数位dp中的数字性质要求数字不含前导0,则可以考虑。 dp数组中保留存在前导0的数字种类。 在遍历每一位时,第一位从1开始,其他位从0开始。 然后再把位数低于当前数字的结果(不含前导0)累加。 (含有前导0时,则可以遍历每一位时都从0开始,最后也不用累加结果) (如果数字是否含有前导0对结果(数字 阅读全文
posted @ 2022-06-21 09:09 80k 阅读(60) 评论(0) 推荐(0) 编辑
摘要:此题中,dp数组保存存在前导0的windy数(因为在使用时,当前位的前面会存在非0数) 结果为不存在前导0的windy数(循环过程中第一次不包含0)。 #include<bits/stdc++.h> using namespace std; typedef long long LL; LL dp[1 阅读全文
posted @ 2022-06-20 20:49 80k 阅读(21) 评论(0) 推荐(0) 编辑
摘要:数位DP的一般形式是: 在[X,Y]区间内,找到满足某种性质的数的个数。 技巧1:两端区间变为一边区间,计算[0, X]和[0, Y]在相减 技巧2:以树的方式考虑,从高位到低位,考虑枚举的数的当前位小于还是等于Y的当前位。 AcWing 1081. 度的数量 #include<bits/stdc+ 阅读全文
posted @ 2022-06-19 22:11 80k 阅读(44) 评论(0) 推荐(0) 编辑
摘要:题目链接: https://codeforces.com/contest/1695/problem/D2 https://atcoder.jp/contests/apc001/tasks/apc001_e 解题思路: 可以考虑,对于每个节点v,其有k个子节点,则每个子节点中至少有k-1个侦查点,才能 阅读全文
posted @ 2022-06-19 22:07 80k 阅读(28) 评论(0) 推荐(0) 编辑
摘要:题目:https://ac.nowcoder.com/acm/contest/11229/F 题解:https://www.bilibili.com/video/BV1Zv4y1u7hT?p=5&spm_id_from=pageDriver&vd_source=75ae018f8d1181302d7 阅读全文
posted @ 2022-06-19 17:44 80k 阅读(30) 评论(0) 推荐(0) 编辑
摘要:AcWing 1073. 树的中心 #include<bits/stdc++.h> using namespace std; typedef long long LL; vector<int> adj[10010]; vector<int> w[10010]; int p[10010]; int w 阅读全文
posted @ 2022-06-16 13:02 80k 阅读(28) 评论(0) 推荐(0) 编辑
摘要:有根树从根、无根树从任意一个节点开始处理即可 1、不考虑边权,考虑路径中点的个数,可以从任意一个节点开始进行DFS,DFS返回以当前节点为根的子树中,以当前节点为端点的最长路径。 经过当前节点的最长路径,即为以当前节点的子节点为端点的前2长的路径长度的和+1,并以此更新全局最长路径(直径)。 2、边 阅读全文
posted @ 2022-06-16 11:52 80k 阅读(28) 评论(0) 推荐(0) 编辑
摘要:区间dp常用的实现方式有:迭代式和记忆化搜索式。 迭代式可以枚举左右端点,也可以考虑先枚举区间长度,这样小区间就会在大区间之前被计算。大区间通过分界点由小区间转移。 例题 AcWing 282. 石子合并 此题直接枚举区间长度和左端点,右端点不超过n。 AcWing 1068. 环形石子合并 此题可 阅读全文
posted @ 2022-06-14 10:15 80k 阅读(37) 评论(0) 推荐(0) 编辑
摘要:当动态规划需要的数组范围太大,且当前状态只与前几维状态相关时,可以用滚动数组存储。 例如 二个滚动数组 dp[i&1]...=dp[i-1&1]... 三个滚动数组 dp[i%3]...=dp[(i-1)%3]....+dp[(i-2)%3].....; 阅读全文
posted @ 2022-06-13 16:21 80k 阅读(67) 评论(0) 推荐(0) 编辑
摘要:291. 蒙德里安的梦想 此题使用状态压缩dp进行计算,状态表示使用一个数j,其中j的二进制位为1的位置表示1*2的第一个小方格并向后延伸。 由于1*2的第二个小方格和2*1的任意一个小方格与后面是没有联系的,对于后面的处理是等价的, 所以状态只用表示和后面产生联系的1*2的第一个小方格。 转移方法 阅读全文
posted @ 2022-06-10 10:39 80k 阅读(33) 评论(0) 推荐(0) 编辑
摘要:dp中的状态机模型会增加一维表示当前的状态。根据状态间的转移方式进行dp 1052. 设计密码 此题需要结合kmp和状态机模型 状态的定义是 dp[i][j]表示遍历到字母i,且匹配了长度为j的模板串,匹配模板串的长度即为状态。 状态的转移根据i-1位的匹配长度,以及i位的字母,计算i位的匹配长度。 阅读全文
posted @ 2022-06-08 19:34 80k 阅读(36) 评论(0) 推荐(0) 编辑
摘要:背包问题可以用dp数组记录最大值。 可以新增另一个数组count,记录等于最大值的方案数, 这样,在算出最大值后,在求解一遍可以以最大值转移过来的方案数的和,即可得到最大值的方案数。 AcWing 11. 背包问题求方案数 代码如下: #include<bits/stdc++.h> using na 阅读全文
posted @ 2022-06-06 18:32 80k 阅读(22) 评论(0) 推荐(0) 编辑
摘要:有依赖的背包问题,节点有树形结构的依赖。 可以递归计算。 递归的过程中,首先对节点的每个子树,计算在不同体积下的最大价值,即dp[u][i]。 dp[u][i]代表在节点u的子树中,选择不超过体积i的物品所得到的最大价值。 然后对当前节点,将每个子节点的每个体积看做分组背包问题中的物品求解。 在递归 阅读全文
posted @ 2022-06-06 11:36 80k 阅读(32) 评论(0) 推荐(0) 编辑
摘要:二进制优化代码比单调队列优化代码更清晰好写。 可以将一维优化成log级别。 其思想是,将数量s,1+2+4+...+s0,对1、2、4、...、s0分别打包, 则小于s的任意一个数量均可由这些打包表示出来。 这样数量为s的多重背包,可分解为这些打包的01背包。 注意,由于此时物品数量增多,必须优化d 阅读全文
posted @ 2022-06-06 00:10 80k 阅读(147) 评论(0) 推荐(0) 编辑
摘要:背包问题求方案时,可以进行dp过后,根据结果进行反推。 要求输出方案时,不能简化dp数组的维数。 当需要以字典序最小输出结果时,可以考虑从后向考虑物品,从后向前构建dp数组。 这样,反推的时候就可以从第一个物品开始考虑,就可以贪心的解决字典序问题。 (也可以使用标记数组解) 例题 AcWing12. 阅读全文
posted @ 2022-05-28 12:33 80k 阅读(26) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示