动态规划
ACM dp
aahs
这个作者很懒,什么都没留下…
展开
-
第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(昆明)C.Cities
题目:Cities题意:给你一个长度为n的序列,a[i]为第i个的颜色,让他们颜色都相同,最少染色多少次,每一次可以将任意一区间染色成相同任意颜色的方块,但要求这个区间的方块颜色全部相同。一开始dp[i][j]是第i块染色为j颜色的最少次数,发现无法处理3 2 1 2 3这样的数据,真正减少次数的贡献其实是当区间的边界点颜色相同时减少贡献,而题目也说了不超过15个一样的颜色。可以发现某一段区间染色都一样主要看最后一个的颜色是什么,区间dp[i][j]此区间全部染为颜色a[j]的最少次数,将连续且相同的区原创 2021-04-08 22:15:40 · 494 阅读 · 0 评论 -
Codeforces Round #688 (Div. 2) D. Checkpoints(概率dp+构造)
题目:D. Checkpoints题意:n个关卡,12\frac{1}{2}21概率通过或者失败,0关卡不是激活态,1是,如果失败退回到之前最近的激活态关卡,位置1一定是1激活态。给定一个k,让你构造一个长度为n的关卡序列让尝试的次数期望为k。首先可以考虑1111类似的序列,转移方程好写,dp[i]:开始在关卡i,通过剩余关卡的期望。可得:dp[i]=dp[i+1]+1+1+dp[i]2dp[i]=\frac{dp[i+1]+1+1+dp[i]}{2}dp[i]=2dp[i+1]+1+1+dp[i]原创 2020-12-11 12:59:42 · 223 阅读 · 0 评论 -
2020-2021 ACM-ICPC Brazil Subregional Programming Contest A. Sticker Album (gym 102861A)
题目:A. Sticker Album题意大意:买卡包,每包里有卡片[A,B]张,获得每个卡片的概率都相同,问买多少卡包能组成N张卡片的期望。设dp[i]为能组成i张卡片需要买的卡包数量期望。可以得到转移方程dp[i]=dp[i+A]+1+...+dp[i+B]+1B−A+1dp[i]=\frac{dp[i+A]+1+...+dp[i+B]+1}{B-A+1}dp[i]=B−A+1dp[i+A]+1+...+dp[i+B]+1由于范围过大,线性递推,sum维护dp[i+A]-dp[i+B]的总和原创 2020-12-06 18:22:51 · 1017 阅读 · 1 评论 -
2020 China Collegiate Programming Contest Qinhuangdao Site(K题)
题目:K. Kingdom’s Power题意:根节点1上有无数个军队,每一次国王都可以指挥一支军队向相邻一个节点运动,问多少次占领所有的节点。首先可以分析出在当前节点有一支军队,那么最小的走法,仔细考虑,必然是先走的子节点深度最浅的,由于走完最浅的返回路径不需要增加过多,但是根节点上有无数个军队,需要判断就是从根节点派兵还是让走到叶子节点的兵在返回。至此可以得出贪心的策略。写法的话,就是sort当前节点的子节点按照最深树的高度排序,找是由其他树的节点走过来的还是根节点指派,一旦是根节点指派那么往上回原创 2020-11-09 16:36:13 · 287 阅读 · 0 评论 -
牛客练习赛69 (D组合+dp F数论)
题目:D 火柴排队组合数需要求一下,顺便总结一下组合数求的几种方法。Cnm=Cn−1m+Cn−1m−1C_n^m=C_{n-1}^{m}+C_{n-1}^{m-1}Cnm=Cn−1m+Cn−1m−1,概念展开证明。由于这里只需要求CnkC_n^{k}Cnk线性推导也可以。选择i个元素增加k,不改变排名,我们需要知道n个数选择1,2,3…个的时候不改变原始排名的数量。n的范围考虑dp,构造状态dp[i][j][0]:前i个人以i结尾选择了j个并且没有改变原始排名的方法数,第i个元素选择没选原创 2020-09-15 19:11:45 · 321 阅读 · 1 评论 -
ICPC North Central NA Contest 2018 B. Maximum Subarrays
题目:click题意:将n个元素的数组分为k段不连续的的数组,使之和最大。dp[i][j]:分为i段 以j结尾的最大值。转移方程易得dp[i][j]=max(dp[i][j-1]+a[j],max(dp[i-1][i-1,i,…,j-1]+a[j]))因为只与i和i-1有关,数组可降为一维,用一个数组维护上一层的最大值即可。#include<cmath>#include<iostream>#include<cstdio>#include<cstrin原创 2020-06-09 10:34:12 · 137 阅读 · 0 评论 -
Codeforces Round #646 (Div. 2)F. Rotating Substrings(dp)
题目:click题意:利用该操作,问最小的操作次数使得s变为t,如果不可能则-1.思路来源:https://www.bilibili.com/video/BV13T4y1J73t?p=6记录一下这个dp,切入点在最长的公共子序列,答案min,肯定需要公共子序列max,n-max(公共子序列的长度)即答案,我们只需要改变不是最长公共子序列的字符,但是注意不是就只能向前移动,所以每次匹配的时候,在者之后的a-z个数s序列一定要大于等于t的,不然无法完成,因为s序列在此之前的非最长公共子序列的字符只能往前原创 2020-06-02 16:25:58 · 198 阅读 · 0 评论 -
有依赖的背包问题
题目:click题意:产生子节点与父节点的关系,并且形成了树,树上dp的推导,根节点有关变为01背包的决策,可知转移方程:dp[root][j]=max(dp[root][j-k]+dp[v][k]);但是要保证root节点一定被拿了,最后在更新一下。#include<cmath>#include<iostream>#include<cstdio>#include<cstring>#include<string>#include原创 2020-05-10 14:18:27 · 132 阅读 · 0 评论 -
51Nod - 1405(树形dp)
题目:click题意:问一棵树上的i点到其他点的距离总和。先考虑一个点i,可以看出一条路是一边是来自子节点的距离,一个是来自父节点的距离,树上dp,dp[i][0]来自子节点的总距离,dp[i][1]来自父节点的总距离,预先处理出子节点和父节点的个数,其中可以化简过程作总和,已经分开写了我就没改了。这里代码有点繁杂,注意细节。#include<cmath>#include<...原创 2020-04-28 20:11:35 · 145 阅读 · 0 评论 -
HDU - 6652 Getting Your Money Back (dp+单调优化)
题目:click题意:给定一个[x,y]的区间,让你拿走你的余额如果猜的x小于等于你的余额,则花费a取出来,不然花费b无法取钱。问最坏的情况你花费的最小值。初看题目有点像二分的题目,但是a,b的值是不相同的,你可以疯狂取a去确定余额当a很小的时候,或者b小疯狂取b去确定,都是不确定的,当a==b的时候是可以直接二分取中点的。不确定取哪个点我就直接枚举取点的情况,像一个区间dp,dp[i][j]...原创 2020-04-27 17:06:50 · 262 阅读 · 0 评论 -
Codeforces 696 B. Puzzles(树形dp+组合+概率)
题目:click题意:从根节点1开始,每一天走一个节点,问访问i节点的期望天数。具体的过程不懂的可以看看题目中的伪代码。简单分析样例,发需要用到一个节点的子节点数目,先跑一遍dfs。每次i节点,跑他的子节点有sonsize[i]!那个需要考虑,由于n的范围1e5不可能利用全排列直接解答,列出每个节点的在全排列中出现的次数,利用概率,可知设n为i节点的子节点数量,(n−1)∗n/2∗(n−2)...原创 2020-04-16 12:10:03 · 217 阅读 · 0 评论 -
UVA - 10572(插头dp)
题目:click可以先看看陈丹琦的论文:基于连通性状态压缩的动态规划问题插头dp中的基本思想以及都有写入在上述论文中。原创 2020-04-03 12:36:35 · 343 阅读 · 0 评论 -
UVA - 11270(插头dp)
题目:click插头dp基础,可以看一下点这里这边有说明。#include<cmath>#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cstdlib>#include<istream>#inc...原创 2020-04-01 21:50:25 · 153 阅读 · 0 评论 -
POJ - 3311(floyd+状压dp)
题目:click题意:找一条经过n个点回到0点的最小距离的路。给定的邻接矩阵没有没有确定每两点之间的最短距离,由于每个点都可以重复多次计算,预先用floyd处理出最短路。再状压dp。#include<cmath>#include<iostream>#include<cstdio>#include<cstring>#include<...原创 2020-04-01 14:47:42 · 143 阅读 · 0 评论 -
AC Challenge (ACM-ICPC 2018南京网络赛)
题目:click题意:给定n个题目,如果要AC第i个,那么需要先AC指定的pj个题目,获得分数为t*a[i]+b[i],问最大获得的分数是多少。状态属性是MAX,但是由牵制条件,n个题目直接可以状态压缩。但是二维的dp显然会T和内存超限,改为一维的数组即可。#include<cmath>#include<iostream>#include<cstdio>...原创 2020-03-31 15:45:00 · 157 阅读 · 0 评论 -
HDU - 3681(bfs+状压dp+二分)
题目:click题意:给定一个n*m的地图,D表示不能走的地方,G补充满能量,问从F点走完所有的Y点最小的能量,走一个消耗一格能量。注意一下题目中所给的范围,Y+G的数量不超过15。在无数条路径中找出一条最佳路径,D是不能走的,所需点的数量顶多16个(加上了F点),其实可以发现本质就是一个TSP的变形问题,所需要的点也就这三个。bfs处理出每两个点的最短距离,建立一个新的图。之后直接状压dp...原创 2020-03-30 23:49:07 · 224 阅读 · 0 评论 -
HDU - 3001(三进制 状态压缩dp)
题目:click题目:给定m条路,每个点不能走过超过2次,走完n个点最小花费。n的范围很小,走完n个点的路有很多条,可以枚举起点或者终点作为一个状态,由于每个点的次数不超过2,三进制状态压缩。#include<cmath>#include<iostream>#include<cstdio>#include<cstring>#includ...原创 2020-03-27 12:51:45 · 389 阅读 · 0 评论 -
HDU - 4352(数位DP+状态压缩+LIS)
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=4352题意:在给定区间L-R内有多少数满足长度为K的最长上升子序列。LIS算法可以事先去了解一下,eg: 3,5,8,9的序列,现在碰到了6,则对序列更新为3,5,6,9,(LIS基于DP的思想,优化后是如上所示的贪心策略加二分,时间复杂度有n*n到n*logn);又因为是由0-9的数字...原创 2019-09-01 21:17:16 · 250 阅读 · 0 评论 -
HDU - 3709(数位DP)
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=3709依据题目意思,建立DP三维状态,dp[pos][mid][sum]表示第pos位以mid为中点建立的力矩值为sum的个数,直接枚举每一位为中心点的情况即可,直接上个板子。(但是莽夫做题选手注意一下全为0的情况,需要减去)#include<iostream>#incl...原创 2019-08-30 15:55:04 · 232 阅读 · 0 评论 -
CodeForces - 55D Beautiful Numbers (数位DP+离散化+数论)
题目来源:http://codeforces.com/problemset/problem/55/D一个数如果能够被它所有位上(非零数字!!!)整除那么这个数就是Beautiful Numbers。给定一个区间询问这个区间内的完美数。这道题目妙啊~~~~~。我们先求出1-9数字的最小公倍数(LCM)(打个表即可),可求出来是2520,2520肯定能被实际的最小公倍数整除,即252...原创 2019-08-30 14:19:00 · 170 阅读 · 0 评论 -
POJ - 1185 and POJ - 3254(经典状压dp)
题目:click题意:在一个给定的字符串地图里放炮兵,炮兵的攻击范围,上下两格,左右两格,H的地方不能放炮兵,炮兵相互之间攻击不到,问地图最多放多少个炮兵。写了挺久有些细节没注意。。。。首先分析题目,m范围可以进行状态压缩,对单独一个网格进行分析,当是P的时候可以进行放或者不放,放的话我需要考虑上下左右的两个格子都没有被放过炮兵,一开始想以当前格点为右下的顶点最多多少个,状态转移有问题,状态枚...原创 2020-03-26 12:00:57 · 113 阅读 · 0 评论 -
POJ 2411(轮廓线dp or 状态压缩dp)
题目:click题意:给定一个长,宽为n,m的矩阵,放满1*2的矩形小块问有多少种方法填满。范围很小,轮廓dp可以做。k5k4k3k2k1状态改写为如上k5k4k3k2k1去表示,1表示这个格子已经放了,0表示没放。(代码中的状态表示也是这个顺序)什么是轮廓线?图中的红色线就是边缘线,由此来进行状态转移。我们对每一个格子进行状态的分析,我们从左上...原创 2020-03-24 16:55:59 · 510 阅读 · 0 评论 -
POJ - 2923(状压dp+背包)
题目:click题意:每次都有两辆车子运货,但每辆车子都有一个运货重量的上限,问最少多少次把所有货运完。n的范围很小,可以考虑状态压缩,一开始并没有想到分两辆车不同的情况而是压缩在一块去对dp,发现复杂度会爆炸,可以先考虑一辆车一次能运多少物资,把可能的状态写出来与另外一辆的所有可能状态组合,得到的状态都是正好只能使用一次,贴合01背包。dp[i]:达到状态i 最小需要的次数。#inclu...原创 2020-03-20 16:46:13 · 230 阅读 · 0 评论 -
HDU-3237(状压DP)
题目:click题意:给定n个书本的高度,若一个区间有连续的高度相同则示为一个混乱度(只有一个也占一个混乱度),告诉你能拿k本书之后放回去,问最小混乱度。题目中说明了书的高度25-32,加上n和k的大小,可以进行状态压缩dp,再来观察每一本书,当到第i本书的时候我们可以选择拿或者不拿,将25-32压缩状态,由于每次拿第i本书的时候需要考虑到前一本书的状态,再设置一个最后的书本高度,dp[i]...原创 2020-03-19 00:13:14 · 263 阅读 · 0 评论 -
Codeforces Round #627 (Div. 3) F. Maximum White Subtree E. Sleeping Schedule
题目:click题意:给定一棵树,节点只为黑或者白,问每一个节点的的子树(连通块)中max(白节点个数-黑节点的个数);把白节点的的值定1,黑的为-1,即计算价值最大,树形dp,联系子,父节点的关系,可直接以i为根进行dp,dp1[i]表示以i为父节点向下max(白-黑),先从下至上做一个dp1记录子节点的max;还有节点的父节点这边的最大连通块没有确定,val表示通过当前节点父节点得到的价...原创 2020-03-13 23:04:18 · 148 阅读 · 0 评论 -
HDU - 1438(状压dp or 递推)
题目:click1.由于需要三种或以上的槽深度,可以0~15的二进制去表示前i个槽的所拥有的状态,还需一个状态判断是否满足相邻的两个数差值是否等于3,直接dp即可。2.通过递推。分析题目,应为状态都比较少可以一个一个分析出来:差值为3的状态只有1和4相邻才能满足。从第i个入手,加入i后变为成功钥匙,加入i后没有变为成功钥匙两种情况。11:如果前i-1个已经构成钥匙,第i个可以为1 2 3...原创 2020-03-11 16:42:44 · 170 阅读 · 0 评论 -
HDU - 4272(贪心 模拟 or 状态压缩dp)
题目:click题意:一个栈,从上往下,栈顶元素可以和他下面的5个元素联系,若一个元素的值与栈顶相同那么这两个元素消失,问能否清空栈。1.看到n的范围,可以考虑用map模拟一下,可AC。2.用动态规划的思想去做进行状态压缩,会发现我们最多只需要考虑序号为 i 下面9个元素,因为下面4个元素可以被序号 i 上边的的元素消除。可以用2^10,...原创 2020-03-09 17:12:39 · 93 阅读 · 0 评论 -
HDU - 1561(树形dp+背包问题)
题目:click每个城堡被攻克,必须之前有一个特定的城堡被攻克,才能攻占这个城堡。形成了一种子节点与父节点的关系,联想到树形dp取解决。走子节点必先走其父亲节点,一次建树,若无则父亲节点为0;dp[i][j]:表示以i为节点,取j个城堡宝藏获得的最大值。#include<cmath>#include<iostream>#include<cstdio>...原创 2020-03-01 21:08:38 · 107 阅读 · 0 评论 -
单调队列优化多重背包
#include<bits/stdc++.h>using namespace std;typedef long long ll;ll dp[20010],que[20010],book[20010];int main(){ int n,m; scanf("%d %d",&n,&m); for(int i=0;i<n;i++) { int c...原创 2020-03-01 11:57:01 · 133 阅读 · 0 评论 -
HDU - 2196(树形dp)
题目来源:click问树中的节点到树中另一个节点的最远路径。从一个节点入手分析,树形dp便是找他与子节点,父节点之间的状态。如果当前节点选择走子节点,可以发现他不会再走父节点,那么他只能一直走下去,走的都是子节点。这个可以先写一个dfs1()来表示,从下至上。如果当前节点选择走父节点,那么之后它又可以选择走父节点的子节点或者父节点的父节点。用dfs2()来表示,从上至下。因为考虑到走父节...原创 2020-02-22 11:37:15 · 193 阅读 · 0 评论 -
POJ - 3659-1463(树形dp或最小支配集 点覆盖)
题目:click问最小需要多少点与树中所有点都有联系。最小支配集:对于图G = <v, e> 来说,最小支配集指的是从 v 中取最少的点组成一个集合,使得 V 中剩余的点都与取出来的点有边相连。设 v0是图的一个支配集,则对于图中的任意一个顶点 u ,要么属于集合 v0, 要么与 v0 中的顶点相邻. 在 v0中除去任何元素后v0 不再是支配集, 则支配集 v0 是极小支配集。同...原创 2020-02-21 20:29:01 · 125 阅读 · 1 评论 -
LightOJ - 1284(概率)
题目来源:click题意:一个三维空间的的点有开关的状态。问开的状态的点的个数期望。x,y,z的范围都是1-100.肯定不是计算两端点之后计算开关灯的个数。由于只有两种状态考虑与组合数有关。可以从点进行切入他被去包含了几次。p就是该点被选中的概率,区间选择为1-i i-x所以乘2 但是可能i-i被重复计算减去1即可。之后利用二项式定理(a+b)^n与 (a-b)^n进行计算。只有被奇数个的...原创 2020-02-17 17:35:31 · 177 阅读 · 0 评论 -
LightOJ - 1038
题目来源:click题目询问给定了一个正整数D,询问用D的因数除D让他变为1的期望次数,D除以一个因数后会变成一个新的D在除以它的因数。看到T以及N的范围可以确定需要预处理一下。dp[i]表示整数i的变为1的期望次数。可以从小到大概率dp即可。cnt为因数的数量。dp[D]=(dp[1]+1)/cnt+…+(dp[D]+1)/cnt;#include<iostream>...原创 2020-02-11 23:34:39 · 134 阅读 · 0 评论 -
CodeForces - 540D (概率dp)
题目来源:click给定了一定数量的石头,剪刀,布,数量分别为r,s,p,石头杀死剪刀,剪刀杀死布,布杀死石头。问最后一个阵营胜利的概率是多少。dp[i][j][k] : 表示还有i个石头j个剪刀k个布的概率。可以直接找出概率的转移方程,由于有多个状态可以转移到dp[i][j][k],所以是加法,具体见代码。#include<iostream>#include<cst...原创 2020-02-11 14:58:00 · 201 阅读 · 0 评论 -
2018-2019 ACM-ICPC, Asia East Continent Finals I. Misunderstood … Missing
题目来源:click题意:A是你的目前的攻击力,D代表每回合开始时对A的增量,初始化的A与D都为0。每次都有三种操作可选择。1.攻击造成A+a[i]伤害。2.不攻击但使D增加b[i]。3.不攻击但使A增加c[i]。问最大伤害。一开始能看出来是一个dp的题目,但是要如何去表示状态,正向的话每次操作都有三种状态,而且对A D 都会变化,由于a[i],b[i],c[i]的范围都很大,数组没...原创 2020-01-31 16:53:18 · 215 阅读 · 0 评论 -
HDU 2476
题目来源:click题意:给定了两个长度相同的字符串A,B,每次操作都能让A的一个子段转化为一个字符,问最少多少次操作是的A转化为B。区间最优解的这类题目可以往区间dp那思考。如果考虑直接由A->B的话,状态不太好转移,不知道哪些相同的字符串需要,哪些不需要。可以先考虑由一个空串转化为B,这一步可以根据B[i]==B[k](1+i<=k<=j)确定状态转移方程区间dp可得,...原创 2020-01-27 17:19:26 · 191 阅读 · 0 评论 -
CodeForces 149 D. Coloring Brackets
题目来源:click一开始就把题目读错了…,以为用的是原创 2020-01-26 14:31:27 · 244 阅读 · 0 评论 -
codeforces 713 C. Sonya and Problem Wihtout a Legend
题目来源:传送门题意把序列转化为严格递增,问最小操作数。与poj3666类似,唯一不同于是严格递增是非严格递增。(若对poj3666有疑问可点击此处:click)而严格递增可以转为为非严格递增。推导:要让序列a[i]<a[i+1]则满足a[i]<=a[i+1]-1,由此可知a[i]-i<=a[i+1]-(i+1),此序列为非严格递增,最终严格递增序列每个a[i]变为a...原创 2020-01-24 16:33:55 · 2794 阅读 · 0 评论 -
POJ3666
题目来源:http://poj.org/problem?id=3666题意:给定一个序列,可以对序列的任意一个数进行加减,使之序列成为一个不递增或者不递减的序列,改变数值1就花费价值1,问使之序列成为一个不递增或者不递减的序列最少需要多少价值。思路:一开始看完题目,想对每个数进行分状态取递增或者递减,当到i时比较之前i-1的数值是多少,但是之前数值可取许多种不同的情况,i也有许多可取的数字...原创 2020-01-21 22:16:49 · 511 阅读 · 0 评论 -
HDU - 1078(dp+bfs防止Memory Limit )
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1078题意:从(1,1)开始每次只能走直线,距离不超过k,走到一格上价值加上该格,问最大价值。第一次写完bfs发现Memory Limit,为了减少空间,对queue加上标记防止多次走重入队列,出队列时取消标记即可。#include<iostream>#include<...原创 2020-01-18 22:51:46 · 308 阅读 · 0 评论