![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
动态规划综合
文章平均质量分 62
1
kaka0010
退役ACMer/算法竞赛菜鸡
展开
-
HDU 6774 String Distance 序列自动机优化lcs
原题链接:https://acm.hdu.edu.cn/showproblem.php?pid=6774目录题意分析Code题意先给你字符串S和T,我们定义两种操作在任意串上删除一个字符在任意串上插入一个字符我们再定义字符串距离∣s,t∣|s,t|∣s,t∣为通过最少操作次数使得s和t相同,每次询问一个区间[l,r],即S[l:r]和T的字符串距离。分析让两个串相等,其实只需要通过第一个操作一定可以最优表示出来,因此就把题目转化为求S[l:r]和T的最长公共子序列。如果直接暴力去匹配,原创 2021-08-18 18:27:42 · 147 阅读 · 0 评论 -
Codeforces Round #737 (Div. 2) D. Ezzat and Grid 线段树模拟最长上升子序列
原题链接:https://codeforces.ml/contest/1557/problem/D目录题意分析Code题意有n行长度为1e9的01串,如果两个串相同位置都有1,我们称这两个串是美丽串,可以删除一些串,问最长美丽串的长度是多少。分析题意还是比较明显的,最长子串我们可以转化成最长上升子序列的模型。在动态规划中LIS就可以用线段树优化到O(NlogN)O(NlogN)O(NlogN),每次找当前最长串,然后再将当前贡献存进去,相当于区间查询,单点修改。而这次,每个01串都有很多小区间,其原创 2021-08-10 10:43:56 · 173 阅读 · 0 评论 -
2021HDU多校第二场 1008 I love exam 背包+DP
原题链接:https://acm.hdu.edu.cn/showproblem.php?pid=6968目录题意分析题意有n门课,m个学习资料,每个学习资料可以在bi天里提升ai的分数,每门课总分不能超过100分,同时可以挂p门课,学习总时长为t。问如何安排学习可以使得总分最大。分析题目相当绕,仔细分析一下,我们可以把每门课的学习资料先预处理出来,用dp[i][j]dp[i][j]dp[i][j]来表示第i门课获得j分最少需要多少天。然后就可以开始快乐dp了。我们设一个状态f[i][j][k][原创 2021-07-22 19:02:28 · 258 阅读 · 1 评论 -
Educational Codeforces Round 111 (Rated for Div. 2) E. Stringforces 二分答案+状压dp
原题链接:https://codeforces.ml/contest/1550/problem/E目录题意分析Code题意有一个字符串由k个字符组成’?'可以填任意字符,字符有一个权值为fififi表示最长连续相同子串的长度,问所有字符中最小的fififi最大可以是多少。分析看到Max(∑MinMax(\sum MinMax(∑Min)问题,最自然想到二分答案,先确定一个长度,然后去填数,判断是否可以满足。首先初步的构想就是这样,然后考虑优化。如果直接暴力去填数,每个位置都要枚举k种情况,也就是原创 2021-07-21 16:07:12 · 102 阅读 · 0 评论 -
Codeforces Round #721 (Div. 2) E. Partition Game 线段树优化DP
原题链接:https://codeforces.ml/contest/1527/problem/E题意给了一个长度为n的序列,其中Cost(t)=∑x∈set(t)last(x)−first(x)Cost(t)=\sum_{x∈set(t)}last(x)-first(x)Cost(t)=∑x∈set(t)last(x)−first(x),我们可以将序列分成k段,问minCost是多少分析不难想到dp的状态dp[i][j]dp[i][j]dp[i][j]代表前i个数分成j组时的最小花费,然后先推出原创 2021-05-24 18:42:53 · 159 阅读 · 2 评论 -
Codeforces Round #369 (Div. 2) C. Coloring Trees DP
原题链接:https://codeforces.ml/problemset/problem/711/C目录题意分析Code题意有n棵树,m种颜色,我们定义美丽度(如果相邻颜色不同则美丽数加一),cost[i][j]为给第i棵树上j种颜色的花费,问最后满足美丽度为k时的最小花费。分析根据状态很容易想到三维的DP,dp[i][j][o]dp[i][j][o]dp[i][j][o]代表前i棵树,当前美丽度为j,当前使用颜色为o时的最小花费,状态转移也可以轻松推出,复杂度是O(nkm^2)。但本题有几个坑原创 2021-05-24 13:44:48 · 156 阅读 · 0 评论 -
牛客每日一题 和与或 数位dp+状态压缩
原题链接:https://ac.nowcoder.com/acm/problem/21336目录题意分析Code题意a[i]∈[0,R[i]]a[i]∈[0,R[i]]a[i]∈[0,R[i]]问满足a[0]+a[1]+...a[n]=a[0]∣a[1]∣..a[n],有多少组a问满足a[0]+a[1]+...a[n]=a[0]|a[1]|..a[n],有多少组a问满足a[0]+a[1]+...a[n]=a[0]∣a[1]∣..a[n],有多少组a分析根据加法和或运算的性质,我们发现在二进制下,原创 2021-05-24 12:19:37 · 408 阅读 · 7 评论 -
牛客练习赛55 E.树 树形dp
原题链接:https://ac.nowcoder.com/acm/contest/2927/E目录题意分析Code题意有一棵树,设dis(x,y)dis(x,y)dis(x,y)表示x到y的距离,求∑i=1n∑j=1ndis2(i,j)\sum_{i=1}^{n}\sum_{j=1}^{n}dis^2(i,j)i=1∑nj=1∑ndis2(i,j)分析树上路径有一种计算方法dis(x,y)=dep[x]+dep[y]−2∗dep[lca(x,y)]dis(x,y)=dep[x]+dep[y原创 2021-05-18 17:12:36 · 124 阅读 · 2 评论 -
牛客练习赛56 C.小魂和他的数列 树状数组优化dp
原题链接:https://ac.nowcoder.com/acm/contest/3566/C目录题意分析Code题意有一个序列含有n个元素,问一共有多少个长度为K的子序列是严格递增的。分析首先,K是具有连续性的,K和K-1具有关联。这样我们可以写出一个状态f[i][j]f[i][j]f[i][j]表示前i个数子序列长度为j的个数,那么转移的方程是f[i][j]=∑f[i−1][j−1](a[i]>a[pre])f[i][j] = \sum_{}f[i-1][j-1](a[i] > a原创 2021-05-14 16:57:02 · 140 阅读 · 1 评论 -
牛客练习赛52 C.烹饪 DP + gcd性质
原题链接:https://ac.nowcoder.com/acm/contest/1084/C目录题意分析Code题意有n个数字,你可以仍意选择一些数字,这些数字可以取正也可以取负且数量无限,问有多少种取数的方法使得取到的这些数拼出所有数字。分析如果我们取两个数,那么要使得ax+by=1ax+by=1ax+by=1,其中a,b为整数,其中gcd(x,y)=1gcd(x,y)=1gcd(x,y)=1那么拓展一下,我们取m个数,使得gcd(a1,a2..am)=1gcd(a1,a2..am)=1gc原创 2021-05-14 14:22:24 · 123 阅读 · 1 评论 -
HDU 6606 Distribution of books 二分答案+权值线段树优化dp
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=6606目录题意分析Code题意有n本书,你需要把它分成k组,每组必须有一个,而且分组必须是连续的,最后多余的书可以丢掉。每组书的权值和为sumisum_{i}sumi,现在我们求max(sum1..sumk)最小max(sum1..sumk)最小max(sum1..sumk)最小分析一般求最大值最小或最小值最大的问题都是用二分答案,所以我们往这方面去想。直接设mid为每组的最大值,那么我们则用这个标原创 2021-05-07 13:23:22 · 112 阅读 · 0 评论 -
ZOJ 4114 Flipping Game DP+组合数
原题链接:https://zoj.pintia.cn/problem-sets/91827364500/problems/91827370509目录题意分析Code题意有两列字符串由01组成,0和1代表灯的亮灭。共有n个点灯,第一个字符串代表操作前的灯状态,第二个字符串代表操作后的灯状态,现在你每回合可以选择m个不同的点灯改变状态,问k回合之后,有多少种方案的操作使字符串1变成字符串2。数据范围0<n,m,k<1000<n,m,k<1000<n,m,k<100分原创 2021-05-03 21:00:55 · 104 阅读 · 0 评论 -
Educational Codeforces Round 108 (Rated for Div. 2) D. Maximum Sum of Products DP
原题链接:https://codeforces.ml/contest/1519/problem/D目录题意分析Code题意有序列a和序列b,你可以对序列a翻转一个区间,最后求∑l=1naibi的最大值\sum_{l=1}^{n}a_{i}b_{i}的最大值l=1∑naibi的最大值分析首先看复杂度,n是5e3的,因此可以用O(N2)O(N^2)O(N2)的算法,然后考虑怎么去翻转。如果用暴力,那么需要找到所有的区间也就是O(N2)O(N^2)O(N2)然后遍历一遍序列O(N)O(N)O(原创 2021-05-03 19:36:33 · 118 阅读 · 0 评论 -
Codeforces Round #214 (Div. 2) C. Dima and Salad 01背包变形
原题链接:https://codeforces.ml/problemset/problem/366/C目录题意分析Code题意有n件物品,每个物品有价值ai,有容量bi,问如何取使得取得物品的总价值是总容量的k倍,求出最大的价值分析转化一下题意,我么可以把容量*k,变成求∑ai=∑bi∗k\sum ai =\sum bi*k∑ai=∑bi∗k,移动一下式子变成bi=ai−bi∗kbi = ai-bi*kbi=ai−bi∗k,最后我们求∑bi\sum bi∑bi答案恰好是0时,最大的∑ai\sum原创 2021-04-13 16:55:09 · 112 阅读 · 0 评论 -
Educational Codeforces Round 80 D. Minimax Problem 二分答案+状压
原题链接:https://codeforces.ml/contest/1288/problem/D题意有一个n个序列,每个序列的长度为m,我们可以任意取两个序列得到bi=max(aik,ajk)bi = max(a_{ik},a_{jk})bi=max(aik,ajk),答案求min(bi),i∈[1,m]min(bi),i∈[1,m]min(bi),i∈[1,m],求最大的答案输出选择的序列号分析题目看起来有点绕,仔细分析一下,求最小值的最大值,二分答案!然后看数据范围,n∈[1,3∗105原创 2021-04-13 16:17:52 · 87 阅读 · 0 评论 -
牛客练习赛78 E. CCA的区间 区间sosdp
原题链接:https://ac.nowcoder.com/acm/contest/11168/E目录题意分析Code题意有一个序列每个元素都是2的幂次。我们要找一个子区间,子区间内没有重复的值,求子区间内各元素之和的最大值,你有一次翻转区间的操作。分析首先看一下数据范围,n是1e5,但从值得角度去看,最大只有2^23也就是说不同的值只有23个,因此可以考虑状压。然后看翻转区间,其实也就是找两个区间,这两个区间值域不能有交集,然后最后的答案就是相加这两个区间的值。因此我们要处理出所有的区间内子集原创 2021-03-25 13:06:47 · 118 阅读 · 0 评论 -
牛客小白月赛7 J方格填色 状态压缩 + 矩阵加速
原题链接:https://ac.nowcoder.com/acm/contest/190/J目录题意分析Code题意有一个m * n的矩阵,如果左右两格不能同为白色,左右两列不能同为黑色,问有多少染色的方法分析因为m只有5,而n有1e18因此肯定是用到状态压缩的,很容易我们可以选出相邻两列中可行的状态转移规律,只要两列不同为0 or 与运算后为0,这样都是符合要求的状态,接下来就是用两列来写出递推的公式。可以构造出一个矩阵来优化线性的计算,我们将所有的状态看成点,这个矩阵其实就是一张图,如果是1原创 2021-03-15 14:32:26 · 149 阅读 · 0 评论 -
牛客小白月赛14 J.I 二分图染色+bitset优化背包
原题链接:https://ac.nowcoder.com/acm/contest/879/J目录题意分析Code题意给定n个点,m条边,问最多可以加多少条边使得该图还是二分图分析满足图是二分图,首先要做到不能存在奇环,也就是染色的时候不同颜色的点是不能相邻的。当我们把一个二分图分成两个部分之后,可以连的边数就是两边点的个数相乘,然后我们所求的也就是(∑ai∗∑bi)−m(\sum ai *\sum bi) -m(∑ai∗∑bi)−m最大。一开始是一个森林,因此可以看成有很多个二选一的物品,因为同原创 2021-03-13 13:34:37 · 325 阅读 · 2 评论 -
Codeforces Round #693 (Div. 3) G - Moving to the Capital 最短路+dp
原题链接:https://codeforces.ml/contest/1472/problem/G目录题意分析Code题意有n个点,m条单项边,每个点上有三个操作如果dis[u] < dis[v],可以直接从u到v,可以进行无限次操作如果dis[u] >= dis[v],可以从u到v,只能操作一次待在u节点不动问从i节点出发能到距离1节点最近的距离是多少?分析如果直接建图,然后每个点上遍历一次肯定可以求出答案,但时间会超时,因此考虑记录已经遍历到的节点。先预处理一遍最短原创 2021-03-03 17:52:48 · 134 阅读 · 1 评论 -
2021牛客寒假算法基础集训营5 E树上博弈 状压dp
原题链接:https://ac.nowcoder.com/acm/contest/9985/E目录题意分析Code题意分析先点几个细节:首先这是一个博弈题,双方肯定都是最优策略,因此每一回合双方都是向着对自己最有利的方向去考虑到数据范围是20,因此状压肯定逃不掉了注意题中给的是无根树,因此任意度为1的点都可以被删掉然后开始考虑状压的含义,如果我们分两个人考虑,先手加上得分取max,后手减去得分取min,这样理论上是可以的,但实现起来略显复杂,因此有什么方法可以将状态对于两个人都适用?可原创 2021-02-24 20:05:18 · 109 阅读 · 0 评论 -
2021牛客寒假算法基础集训营6 机器人 状压dp
原题链接:https://ac.nowcoder.com/acm/contest/9986/G题意分析数据只有20,马上想到状压dp,用dp[state]来表示状态为state时最大的返回值,state压缩的二进制中1代表已经选过的点,0代表没有选过的点,直接转移就可以。题目有一个坑点,最大可以达到2020 ,比赛中被坑了好多次,用__int128就可以。Code#include <bits/stdc++.h>using namespace std;//#define ACM_原创 2021-02-24 18:41:20 · 145 阅读 · 0 评论 -
【数位dp】刷题集(更新中)
目录模板例题不要62windy数手机号码模板应用范围:[l, r]中满足某种情况的数个数ll dfs(int pos, int pre, bool limit, bool lead) { if (pos == -1) return 1; if (!limit && !lead && dp[pos][...][...] != -1) return dp[pos][...][...]; int End = limit ? a[pos] : 9;原创 2021-02-16 12:38:26 · 224 阅读 · 0 评论 -
【状压dp】学习笔记 | 例题
参考大佬博客链接目录简单介绍基础位运算常用技巧例题[Corn Fields G](https://www.luogu.com.cn/problem/P1879)[SCOI2005]互不侵犯简单介绍状压 dp 是动态规划的一种,通过将状态压缩为整数来达到优化转移的目的。基础位运算名称符号举例按位与a & b111 & 101 = 101按位或a l b111 & 000 = 111按位取反~a~100 = 011按位异或a原创 2021-02-16 12:34:07 · 152 阅读 · 0 评论