
ACM_DP
文章平均质量分 78
逍遥丶綦
这个作者很懒,什么都没留下…
展开
-
树型dp hdu5834 Magic boy Bi Luo with his excited tree
传送门:点击打开连接 题意:一棵树,对于每个点出发,结束位置可以是任意的,走过的点权值只加一次,走过的边权值要减去走过的次数乘以边权值。 问对于每一个点,权值和最大是多少。 思路: 我们需要维护4个内容 A[u]表示从u往下走,并回到u,路上的最大权值之和 B[u]表示从u往下走,不需要回到u,路上的最大权值之和 C[u]表示从u往上走,需要回到u,路上的最大权值之和 D[u]表示从原创 2016-08-15 01:17:26 · 897 阅读 · 0 评论 -
离线+dp 51Nod1020 逆序排列
传送门:点击打开链接题意:求长度为n的排列的逆序对等于k的排列总数,取模1e9+7思路:刚开始想找规律,但是发现根本没法搞。。但是我们如果从dp的角度去思考,就能找到一个dp是这样的dp[n][k]=dp[n-1][i],max(k-n+1,0)其中边界dp[0][0]=1那么就能用离线+前缀和去搞答案了要注意的就是ans等于0的情况,离线的时候要注意p是否能取到所有的原创 2015-12-25 01:07:43 · 1013 阅读 · 0 评论 -
Codeforces507D 数位dp The Maths Lecture
传送门:点击打开链接题意:一个长度为n的数,没有前缀0,如果这个数存在一个后缀y,这个y没有前导0且大于0,能整除k,这么就认为数x是满足要求的问有多少个数x满足要求思路:明显是从后往前算的数位dp。首先我们肯定可以想到dp[i][j]表示正在考虑第i位对后面的影响,当前的数字取模k等于j那么再枚举第i+1位是什么数字,就能往后面转移了,不过这道题有两个细节和一个trick原创 2016-01-08 01:30:36 · 868 阅读 · 0 评论 -
树型dp hdu5593 ZYB's Tree
传送门:点击打开链接题意:告诉你如何构造一颗树,然后询问有多少点对的距离小于等于K(K思路:用csy的话来说,这就是个傻逼题,然而比赛的时候就是傻逼不会- -设dp[u][k]表示当节点u作为子树的根节点时,在这个子树中有多少点对与u的距离那么ans[u]=dp[u][k]+sigma(dp[v][k-i]-dp[vlast][k-i-1]) 1其实就是说,如果选u作为一个点对原创 2015-12-06 03:04:13 · 1035 阅读 · 0 评论 -
二维LIS Gym100820G Racing Gems
传送门:点击打开链接题意:一个赛车捡金币的游戏,刚开始的起点在x轴,赛车跑道宽为w,最左边是y轴。刚开始你可以选择在x轴的任意位置启动。有很多金币在赛道中,位置已经告诉你。还告诉了你一个r,当y轴方向的车速为v时,x轴的车速只能在[-v/r,v/r]这个区间中,说白了就是在y轴上移动s距离,x轴上只能移动[-w/r,w/r]距离。赛车在y轴方向只能朝正方向移动。问到达终点时,最多能拾到多少金币原创 2016-01-24 14:06:04 · 1465 阅读 · 0 评论 -
hash codeforces567C Geometric Progression
题意,在原数组中找到3个下标,a问(a,b,c)这样的三元组有多少个思路:dp[i][0]表示以i为A[a]的个数dp[i][1]表示以i为A[b]的个数dp[i][2]表示以i为A[c]的个数可以得到转移方程如果i%k==0 dp[i][2]+=dp[i/k][1]如果i%k==0 dp[i][1]+=dp[i/k][0]dp[i][0]++原创 2015-08-08 15:31:46 · 919 阅读 · 0 评论 -
dp+trie nbut1222 English Game
传送门:点击打开链接题意:告诉你一个字典,每个单词有一个权值,再给你一个字符串,问这个字符串用字典中的单词不重复字母的覆盖,最大权值是多少。一个单词可以重复出现思路:先如果不考虑单词匹配,那么就是一个单纯的dp,dp[i]表示前i个已被完全覆盖此时的权值大小,如果在i位置后面有一个单词的长度为l,权值是w,且此时在i位置后长度为l的子字符串就等于那个单词,说明那个单词能放在这个位置,就有d原创 2015-08-21 23:09:47 · 1039 阅读 · 0 评论 -
AC自动机+dp+大数 poj1625
传送门:点击打开链接题意:告诉你有哪些字符可以用,然后再告诉你哪些单词不能出现,要你求长度为m的字符串只由给你的字符组成,但是不能出现那些单词的种类数。思路:..一分析就发现,,貌似爆long long了,,醉了。。总的思路和那个DNA的思路是一样的,用AC自动机完成了矩阵的转移,很逆天的压缩了状态。。除了大数其他和那题基本一样的可以去看看那题..#include#include#原创 2015-10-23 11:56:02 · 849 阅读 · 0 评论 -
AC自动机+状压dp hdu2825 Wireless Password
传送门:点击打开链接题意:有个密码长度为n,现在有m个魔力单词,要求密码中魔力单词的种类数>=k,问这种密码的种类数。思路:和之前一样,我们会想到AC自动机去压缩状态,把状态给简化。然后我们就会想到一个问题,,因为一种种类实际上可能会出现很多次,但是统计的时候只统计一次,所以用普通的dp可能就做不到了,那么我们就必须考虑复杂度更高的方法,又看到m但是这题也有两个很容易TLE的问题,,首原创 2015-10-23 22:50:50 · 893 阅读 · 0 评论 -
AC自动机+dp打印路径 hdu2296 Ring
传送门:点击打开链接题意:告诉你m个字符串,每个字符串有一个权值。再告诉你n,要求新的字符串长度小于等于n,现在求总权值最大的最小字典序字符串是多少思路:首先用AC自动机去把状态优化,然后列出dp方程,这些都是不难的,问题还在于打印路径上。由于要求字典序最小,但是实际上在AC自动机顺着插入的话,只能比较后缀,根本比较不了前缀,所以不是很好做。有的题解是插入字符串到AC自动机的时候就把它翻转原创 2015-10-24 16:00:49 · 898 阅读 · 0 评论 -
AC自动机 zoj3228 Searching the String
传送门:点击打开链接题意:告诉你原串,告诉你很多个子串,有两种匹配模式,一种是可以重叠的匹配,一种是不能重叠的,问每个子串出现的次数。子串可能有重复的出现。思路:这题揭示了AC自动机的两种处理方法。首先是当AC自动机中出现有串重复的时候,我们应该怎么处理,我这里用到了一个数组pre,如果这个节点结尾的子串是第一次出现,pre标记为自己,如果这个节点结尾的子串不是第一次出现,那么就把pr原创 2015-10-25 16:26:33 · 911 阅读 · 0 评论 -
hash+dp打印路径 Codeforces615C Running Track
传送门:点击打开链接题意:a串有很多个,然后能把a串剪断,剪成很多条小区间,区间还能翻转。然后给你一个b串,求b串用a串的区间的字符去组合出来,最少需要的区间数,要求输出方案。长度思路:首先,我的思路非常蠢。。标准答案是暴力+贪心,确实后来想了下讲的太有道理了~我的思路是,把a串的所有子串全部取出来,然后双哈希保存。然后再对b串做dp。如果[j+1,i]在a串中存在,那么就能有dp原创 2016-01-09 22:24:12 · 1021 阅读 · 0 评论 -
dp Codeforces505C Mr. Kitayuta, the Treasure Hunter
传送门:点击打开链接题意:现在有3w个点,最开始站在第0个点上,第一次会向右跳d个点。若上一次为d,这次只能向右跳d-1,d,和d+1步。步数不能为0,当不能向右跳时即停止。思路:不考虑时间和空间,最朴素的方法就是设dp[i][j]表示上一步跳了j步,当前在i点上,之后的转移也很好写然而这明显是会爆时间爆空间的,不过我们可以发现,二维的j并不需要等于30000,而只会在[d-245原创 2016-01-30 10:25:19 · 1465 阅读 · 2 评论 -
树型dp Codeforces633F The Chocolate Spree
传送门:点击打开链接题意:给你一棵树,有点权,求两条不相交的路径的点权和的最大值思路:Tourist太神辣,这个代码看他的才学会的,但是他只用了10分钟敲了140行..Orz先一次DFS求出,对于所有的点u,经过这个u点到叶子的路径点权和最大值记为down[u],以及u的子树中一条路径点权和最大值记为best[u]然后用队列来处理,其实也可以用DFS来处理,那么数组就不能用全局变量原创 2016-03-02 11:19:46 · 1645 阅读 · 0 评论 -
贪心+dp zoj3905 Cake
传送门:点击打开链接题意:n(一定为偶数)块蛋糕,每块蛋糕Alice有一个权值,Bob有一个权值。每一次Alice选择两块蛋糕给Bob看,Bob会选择出他的观点的权值最大的蛋糕,然后Alice拿剩下的那一块,问Alice能获得的最大总权值是多少思路:我们可以发现,Bob的权值最大的那一块,无论如何,一定最后会给Bob。那么我们能发现其中好像存在一点规律。如果我们按照Bob认为的权值从大原创 2015-10-12 15:51:21 · 1172 阅读 · 0 评论 -
凸包+三分 Codeforces631E roduct Sum
传送门:这里写链接内容 题意:允许交换两个位置位置的数字,最终使得∑nii∗A[i]\sum_i^ni*A[i] 最大,求最大值 思路:我们列出式子,很明显的可以发现可以用斜率优化来做。 但是我们发现A数组并不是不递减的,所以我们不能用单调队列来维护。 对于这题,我们应该去维护下凸包,然后在凸包上二分来做。 但是在做的时候,发现有非常多的细节要处理,必须非常细心才行#include <ma原创 2016-06-03 15:09:33 · 701 阅读 · 0 评论 -
lcp+dp hzau17 LCS
传送门:点击打开链接题意:求s1和s2的最长公共子序列,要求每一连续部分的长度都要>=k(|s1,s2|思路:我们可能会考虑3维dp,但是很明显是会超时的,所以我们肯定是要用贪心或者数据结构降一维我们来考虑贪心。假如我已经知道了以i为结尾的前缀,以j为结尾的前缀的公共后缀,那么我们在(i,j)这个位置就能知道前面有多长的子串是一样的,即lcp如果我们直接考虑从1枚举到lcp,那复杂原创 2016-05-15 22:29:50 · 512 阅读 · 0 评论 -
二分+树型 dp hdu5682 zxa and leaf
传送门:点击打开链接题意:一棵树n个点,其中有一些点已经有权值,现在给剩下的点安排权值,使得树中相邻两点的之差绝对值的最大值最小。思路:如果我们首先就想到了二分,那后面很好想了。。直接二分答案,之后check中,我们随便取1个点为根节点,然后从下向上按拓扑序做树型dp。设SL[u]和SR[u]表示节点u能填的数字的范围我们从下往上,然后只要判断是否有交集,即有解,我们就能知道当前答原创 2016-05-14 22:19:00 · 551 阅读 · 0 评论 -
斜率优化 Snowdrop修长廊 scu dp练习B题
传送门:点击打开链接题意:要覆盖完n个点,要覆盖掉[i,j]的代价是(X[i]-X[j])*(X[i]-X[j])+W,求覆盖完所有点的最小代价思路:这是一道非常裸的斜率优化。网上讲解斜率优化的博客还是比较多的,斜率优化通常就是化简后,最后得到了一个斜率的式子推荐个学习的链接点击打开链接我稍微讲下我一开始看着比较费劲的地方。。(下面内容均建立在已经读完上面那原创 2016-05-18 20:22:22 · 559 阅读 · 0 评论 -
记忆化搜索 Codeforces666A Reberland Linguistics
传送门:点击打开链接题意:给一个串s(|s| 4,后缀的长度为2或3。要求同一个后缀不会连续出现2次。问有多少后缀。思路:我们直接考虑从后往前搜索,保存后一个词和当前的词。但是这样直接搜索肯定会超时的。不过我们可以发现,中间有大量重复的,所以我们只需要记忆化一下位置,当前词的长度,后一个词的长度,就不会超时了#include #include #include #include原创 2016-04-30 11:14:03 · 676 阅读 · 0 评论 -
dp hdu5653 xiaoxin and his watermelon candy
传送门:点击打开链接题意:有n个箱子排成一排,有m个炸弹,位置告诉你,现在炸弹的左边伤害和右边伤害可以自己控制,要求 每个炸弹炸的箱子数的累乘,输出答案取log2并乘以1e6思路:直接2for xjb搞就行了,大概就是某个区间里刚好只有一个炸弹时,就是满足的,然后就从前面往后面更新一下#include #include #include #include #include #原创 2016-03-27 21:48:31 · 657 阅读 · 0 评论 -
树型dp hdu5647 DZY Loves Connecting
传送门:点击打开链接题意:定义连通集S为,任意一对u,v属于S,u到v的树最短路径经过所有的节点都在S内。求所有这样的连通集大小之和思路:看到维护大小之和,通常还需要维护数量。看了下吉司机的代码写的很简单,只要理解好乘法原理,就很好做了#include #include #include #include #include #include #include #inc原创 2016-03-23 16:21:05 · 1267 阅读 · 0 评论 -
KMP+dp Codeforces346B Lucky Common Subsequence
传送门:点击打开链接题意:告诉你A,B,C,求A和B的最长公共子序列,并且C不是最长公共子序列的子串思路:先求C的Next数组,利用Next数组来完成状态的转移。而且,用KMP来优化的dp,通常都是往后更新的写法。对于打印路径,我们能用DFS来完成,这里有个我觉得很不错的写法,就是直接利用状压,来保存数字,感觉这样可以避免写一个结构体,方便的多然后dp部分,就是在求最长公共子序原创 2016-03-30 19:02:37 · 982 阅读 · 0 评论 -
KMP+区间dp csu1620 A Cure for the Common Code
传送门:点击打开链接题意:可以把字符串用过括号折叠起来。现在给你原串,问折叠后最短是多少,len思路,首先,我们通过O(n^2)来预处理出每个区间里的最短循环节。之后,我们直接按照区间dp用记忆化搜索去搞就行了。#include #include #include #include #include #include #include #include #inclu原创 2016-03-18 13:19:58 · 1208 阅读 · 0 评论 -
lcp+dp Codeforces611D New Year and Ancient Prophecy
传送门:点击打开链接题意:长为n的只有数字组成的字符串(n思路:最难的地方,就是如何去快速判断两个数字的大小谁大谁小呢?我们先来讲下最长公共前缀lcp的定义。如果有串A和串B,lcp[i][j]表示的是串A从原串第i位置开始,串B从原串第j位置开始,那么从这两个位置开始的有多少个字符相等那么如何来求lcp呢,方程很简单,看了都能懂lcp[i][j]=lcp[i+1][j+1]+原创 2016-01-01 17:58:55 · 1097 阅读 · 0 评论 -
单调队列 poj1821 Fence
传送门:点击打开链接题意:有K个工人,和长为N的篱笆,现在要给篱笆上色。每个工人坐在Si上,他能刷的最大范围是Li,且必须是一个连续子区间,而且必须过Si,他刷完后能获得Pi钱问如何分配,使得K个工人的总利润最大思路:先设出方程,设dp[i][j]表示前i个工人,前j个篱笆的最大获利那么就有dp[i][j]=max(dp[i-1][j],dp[i][j-1]);dp[i原创 2015-12-16 15:29:59 · 1943 阅读 · 0 评论 -
单调队列 hdu3401 Trade
传送门:点击打开链接题意:有种股票,现在知道n天,拥有的股票股数必须思路:一道非常好的单调队列优化dp的好题!首先,dp无非就两种设法,1.dp[i][j]表示最后一次操作为第i天,已经拥有了j只股票的赚的最大钱数.2.dp[i][j]前i天里,已经拥有了j只股票的赚的最大钱数.我们可以发现,如果是第一种设法,方程不好转移,所以我们采用第二种,那么很容易就能列出方程原创 2015-12-15 00:29:32 · 762 阅读 · 0 评论 -
多线程dp hdu2686 Matrix
传送门:点击打开链接题意:给一个矩阵,刚开始两个点都在(1,1),然后一起出发,只能向右走或者向下走,只能在(n,n)汇合,在到终点之前两个不能在同一个格子内,得分就是两条路径的数字之和。求得分最大。因为数据比较小,所以可以直接开一个dp[x1][y1][x2][y2]来表示一个点在(x1,y1)另一个点在(x2,y2)时的最大得分然后利用记忆化搜索递推就能得到答案了#includ原创 2015-08-18 21:42:41 · 1194 阅读 · 0 评论 -
状压dp Mondriaan's Dream poj2411
超经典的一道题目,实现这题的方法也有很多种1.利用DFS建立矩阵,然后通过快速矩阵幂得到答案(运用于min(m,n)比较小,但是max(m,n)非常大的情况)2.利用dp状压解决第一种在我的另一篇博客里有http://blog.youkuaiyun.com/qwb492859377/article/details/47138821我们在这里讨论第二种方法。刘汝佳的算原创 2015-08-02 01:15:44 · 1182 阅读 · 0 评论 -
区间dp Gym100712D Alternating Strings
地址:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=195706对这种字符串dp有恐惧症..对于这题,N对于这题,首先我们可以预处理出d[i][j],如果区间[i,j]为交替串,就是1,否则就是0然后再设一个F[i]表示,最后一刀是在第i个和第i-1个字符的中间剪开的方法数然后动态原创 2015-07-20 16:30:37 · 1089 阅读 · 0 评论 -
二维无序LIS ACdream1216 Beautiful People
传送门:点击打开链接题意:告诉你n个人,每个人有个s和b连个值,要求从n个人中选出数量最多的人,使任意两个人(i,j)都有si思路:首先很容易想到DAG模型,但是这题的n其实仔细想想这道题,和普通的LIS还是有不一样的地方的。那就是他的顺序并不是给定的!!什么意思呢,虽说是二维LIS,但是他给出的n个人,并不是必须要递增,而是只要选出一部分,然后排序一下,让他们递增就可以了,其实这就是原创 2015-08-27 14:27:16 · 1201 阅读 · 0 评论 -
分组背包 hdu1712 ACboy needs your help
最裸的分组背包记住枚举顺序for(枚举组数){ for(从大到小枚举体积){ for(枚举这一组中的个体){ 和01背包的滚动数组代码完全一致 } }}如果不知道为什么,强烈推荐百度一下 背包九讲,里面说的非常的清楚~#include#include#include#includ原创 2015-07-29 01:00:55 · 854 阅读 · 0 评论 -
dp poj1948 Triangular Pastures
可能一开始会想到关于数量的dp,但是发现并不好操作联想01背包,就可以发现,这题和01背包还是有很多共同特点的,我们为什么不拿长度来dp呢?三角形的变长也有一些比较有趣的性质,,以前都没留意过一般对于三角形的题目,都可以从这几个特点去思考假如变长大小关系是a>=b>=c,那么会有b>=(a+b+c)/2 ,0这使我们枚举变长成为了可能。然后设dp[i][j]表示b为原创 2015-07-29 12:14:59 · 813 阅读 · 0 评论 -
区间dp poj3280 Cheapest Palindrome
还是很害怕这种字符串的题目的,但是这题细想起来,,又并不是想象中那么难题意:添加或者删除某些字符,使原串变成回文串设dp[i][j]表示使[i,j]区间变成回文串所需要的最小代价当i>j或者i==j的时候,认为dp[i][j]等于0那么dp[i][j]会从哪些地方转移过来呢首先,当S[i]==S[j]时候,因为想让[i,j]变成回文串,那么[i+1,原创 2015-07-29 00:49:21 · 817 阅读 · 0 评论 -
分组背包 hdu3033 I love sneakers!
又是一种分组背包的模板,,好好研究一般的分组背包是,每个背包中最多只能选一件,但是并没有要求下限这题的特别点是,每个背包至少一件,没有上限刚好反了,,感觉挺有意思的设dp[i][j]表示第i个品牌中,钱数为j能得到的最大价值因为一个品牌中至少取一件,dp[i][j]可能是从这个转移过来,也可能是从i-1转移过来的dp[i][j]=max(dp[i][j],m原创 2015-07-29 00:24:37 · 1023 阅读 · 2 评论 -
树型dp poj3071 Football
因为是二叉结构,,所以会比较容易想到树型的结构,所以自然想到树型dp然而怎么设dp呢,,我是这样的dp[MX节点对应的区间,和线段树的写法是一样的,,其实就是在线段树的build的代码上,把push_up改了一下而已,其他的都差不多对于某个节点,先求出左右节点的概率情况,然后把左右节点的答案合并在节点对应的区间内,枚举i赢了如果i在左树,那么就枚举右树中有哪些人j。原创 2015-07-27 09:38:41 · 860 阅读 · 0 评论 -
最长公共上升子序列 csu1120 病毒
dp[i][j]维护的是A中前i个,B中以第j个结尾的最长公共上升子序列的长度看清楚哈,i在A中的概念是前i个,意思是并不要求一定要是i结尾B中的j是必须是j结尾的然后怎么转移呢首先,当A[i]!=B[j]的时候,因为B[j]必须要用来结尾,所以dp[i][j=dp[i-1][j]当A[i]==B[j]的时候,会有dp[i][j]=max(dp[i-1][k])+1原创 2015-07-27 17:41:57 · 1205 阅读 · 0 评论 -
混合背包 hdu5410 CRB and His Birthday
传送门:点击打开链接题意:你有M块钱,现在有N件商品第i件商品要Wi块,如果你购买x个这样的商品,你将得到Ai*x+Bi个糖果问能得到的最多的糖果数思路:非常好的一道01背包和完全背包结合的题目首先,对于第i件商品,如果只买1个,得到的价值是Ai+Bi如果在买1个的基础上再买,得到的价值就是Ai也就是说,除了第一次是Ai+Bi,以后购买都是Ai那么,我们能否原创 2015-08-20 17:41:34 · 1313 阅读 · 1 评论 -
状压dp Codeforces580D Kefa and Dishes
传送门:点击打开链接题意:有n种菜,现在选m种菜来吃,还有很多条好处,如果在吃y的前一道菜是x的话,那么就可以获得满意度。每一种菜都有一个满意度。思路:...只能说Codeforces的测评机实在是太好了,n=18,O(n^2*2^n)复杂度的记忆化搜索代码都能在500ms跑出来,我自己本地跑了3秒多- -如果你敢写O(n^2*2^n)复杂度的代码的话,那基本就做完了。设dp[i][S原创 2015-10-17 19:18:29 · 1169 阅读 · 0 评论 -
dp hdu5433 Xiao Ming climbing
传送门:点击打开链接题意:告诉你图,然后告诉你初始斗气,你当前的位置,终点位置,每走一步所需要的体力等于两个位置的权值之差除以当前斗气k,然后斗气减一思路:因为数据很小,所以最简单的方法当然是动态规划去做设d[i][j][k]表示当前在(i,j)且斗气为k时消耗的最小体力,然后向4个方向转移就行了#include#include#include#include#includ原创 2015-09-14 10:25:49 · 897 阅读 · 0 评论