随笔分类 - 动态规划
摘要:gate 我太菜了,看了标签是背包还不知道是怎么回事qaq 看了下题解,意识到这是个类似素数筛的东西。 感性理解可以发现,原货币系统中能被表示出来的是可以不选的,剩下的就是要选的。所以最小的一定要选,把原货币系统从小到大排序。 枚举原货币系统中的货币a[i],枚举金额j(a[i]+1<j<a[n])
阅读全文
摘要:gate 四 重 循 环 暴 力 枚 举 因为最终状态是用完所有的牌…所以可以根据用了多少牌来dp 设f[i][j][k][l]表示每种牌用了多少张…它就可以从f[i-1][j][k][k],f[i][j-1][k][l]...转移过来 代码如下 #include<cstdio> #include<
阅读全文
摘要:gate 第一反应是树形dp,讨论兄弟和爷爷两种情况。想了想觉得不够优雅就去看了题解… 优雅的做法是枚举中间点! 设当前点为x,x所连的点为(a,b,c,...) 对于求最大值,只要每次记录x连接的最大的两个点,并检查更新答案即可。 因为求有序点对,所以(a,b)(b,a)都会被算一次。 那么x的最
阅读全文
摘要:gate 经过第二天平复心情后回来写题解… 写bug5分钟 debug2小时 显然,区间dp,开2倍长度+前缀和 f[i][j][t]表示区间(i,j)分成t段所得到的最大值。 区间长度、起点、分段数、断点,四重循环。 注意范围——比如分段数的上限是min(m,j-i+1). *之前的枚举顺序不对但
阅读全文
摘要:gate 这题想不出怎么dp于是看了眼题解…… 是区间dpQwQ(看来什么前中后序遍历的概念还是有点不熟练) 因为中序遍历,左右儿子一定在根节点的左右。就是把树压扁了...(这个好像是企鹅学长说的qwq?) f[i][j]表示区间i,j所能得到的最大值。最外层循环从小到大枚举长度。 f[i][j]
阅读全文
摘要:gate 就这个破题dp+高精度...我de了好久/kk 设f[i][j]表示前i个数,用了j个*号,num(l,r)表示从第l位到第r位表示的数字 f[i][j] = max(f[i][j],f[k][j-1]*num(k+1,i)) 不用高精是60pts,代码如下: #include<cstdi
阅读全文
摘要:gate 随便做做dp _(:3」∠)_ 坐标dp,和传纸条一样的,两条路分别为i,j和k,i+j-k。 注意:为了保证i+j-k>0,k的范围应该是min(n,i+j-1) 因为这个wa了两回,我太菜了 代码如下 #include<cstdio> #include<iostream> #inclu
阅读全文
摘要:gate 第二道状压dp... 预处理每种状态j所含1的个数为sum[j] f[i][j][l]代表第i行,状态为j,当前共有l个国王 枚举本层状态j,上一层状态k,判断八方向是否有相邻:k&j||(k<<1)&j||(k>>1)&j 枚举国王数l,则有f[i][j][l] += f[i-1][k]
阅读全文
摘要:gate 前置知识 位运算常用方法 判断一个数字x二进制下第i位是不是1 return ((1<<(i−1))&x)?true:false 将一个数字x二进制下第i位更改成1。 x=x|(1<<(i−1)) 把一个数字二进制下最靠右的第一个1去掉。 x=x&(x−1) 判断一个数是否为2的幂 ret
阅读全文
摘要:传送门 终于明白数位DP是什么了 虽然说是dp,实际上是记忆化搜索 看这道题的题面: 不含前导零,且相邻两个数字之差至少为2的正整数被称为windy数。 求:在A和B之间,包括A和B,总共有多少个windy数? 这道题中给出了几个限定条件。 其中,前导零、数字上限(A,B)是数位dp的题目中比较常见
阅读全文
摘要:传送门 修改数组里的值,使数组(不严格)单调,且改动最小。 考虑动态规划。 上升和下降的方法都是一样的,以上升为例。 当修改一个数时,一定会把它修改成数组中出现过的某一个数。 那么把数组离散化一下,$b[i]$表示数组中第$i$大的数(这里可以用unique去重一下)。 那么只要枚举将每个数修改成其
阅读全文
摘要:关于dp问题的一些汇总( ´▽`) 一、线型dp 就是普通的dp啊.. 像最大上升子序列,最长公共子序列(LCS)都用到了这种思想w 二、背包型dp 具体参考背包九讲吧qwq 常用的大概就01背包,完全背包,多重背包,有依赖的背包( Luogu P1064 金明的预算方案)... 01背包和完全背包
阅读全文
摘要:传送门 多重背包板子题, 多重背包就是每种东西有好几个,可以把它拆分成一个一个的01背包 优化:二进制拆分(拆成1+2+4+8+16+...) 比如18=1+2+4+8+3,可以证明18以内的任何数都可以用这几个数的和表示, 所以就把2个,4个....绑定为一个物品,和一个一个的效果是一样的 这样就
阅读全文
摘要:传送门 这道题信息量好大啊 1.Dilworth定理 Dilworth定理:对于一个偏序集,最少链划分等于最长反链长度。 Dilworth定理的对偶定理:对于一个偏序集,其最少反链划分数等于其最长链的长度。 其实就是说,对于一个序列, 最大上升子序列长度 = 不上升子序列个数,最大不上升子序列长度
阅读全文
摘要:题目qwq (第一道蓝题) 先把第一个序列每个数出现的顺序记下来(数字本身不用记), 然后第二个序列的每个数都对照它的顺序,这样只要得到一个升序的序列就行了qwq 如果遇到出现顺序在前面的数,就用二分法找一下它的位置,然后把原来存下来的顺序覆盖掉 #include<cstdio> using nam
阅读全文
摘要:题目 (第一道绿题) 有点像最大子矩阵qwq 用前缀和存图,l,r代表横向的一段区间,区间和就是a[r]-a[l-1] 然后用一个k从上到下dp...因为每次l,r变化的时候原来的k就没有用了,所以k开一个表示第几行的一维数组,把最大值记下来就行qwq 特殊的是如果为0是不能选择的...改成-∞就可
阅读全文

浙公网安备 33010602011771号