
动态规划
FeBr2
(๑•̀ㅂ•́)و✧
展开
-
状压DP——FZU 2218
题目链接: https://vjudge.net/problem/FZU-2218题意:给出一个字符串,求出它的两个子串,满足互相之间不含有相同字符,且长度的乘积最大,输出这个最大乘积。分析:首先,我们要计算出这个字符串的所有子串包含的字符情况,因为不同字符的个数最多为16,所以我们可以通过一个长度为16的二进制串来表示某一个子串的字符包含情况,可以在 O(len(str)2)O(len(str原创 2017-05-03 22:08:19 · 369 阅读 · 0 评论 -
DP+树状数组——FZU 2236 第十四个目标
题目链接: http://acm.fzu.edu.cn/problem.php?pid=2236题意:给出长度为N的数组,求一共有多少个严格递增子序列分析:我们很容易想到动态规划来解这道题,设定 DP[i]DP[i] 为以第i个元素结尾的严格递增子序列的数量,那么 DP[i]=∑i−1j=1DP[j]where(A[j]<A[i])DP[i] = \sum_{j=1}^{i-1} DP[j] w原创 2017-03-19 13:43:15 · 467 阅读 · 0 评论 -
字符串DP——HDU 6017 Girls Love 233
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6017题意: 给出一个长度为N的23串,交换相邻2个字符的代价是2,求在花费不超过m的限制下,原串中能包含的最大数量的’233’子串。分析:我们发现相同字符之间的交换对结果无意义,所以如果有交换必然是2,3之间的交换,因此可以理解为相同字符之间的相对位置是固定的。那么我们可以搞出一个状态:DP[i]原创 2017-03-19 12:07:03 · 572 阅读 · 0 评论 -
DP+预处理优化——玲珑学院OJ 1108
题目连接:http://www.ifrog.cc/acm/problem/1108分析:用DP[i][j]表示前i个数达到和j的u的取值方法数,那么我们每次更新: DP[i][j]=∑w[i]u=0DP[i−1][j−gcd(u,A[i])]DP[i][j] = \sum ^{w[i]}_{u = 0} DP[i-1][j-gcd(u,A[i])] 即可,但是N的范围室1E3,加上gcd的时间,原创 2017-03-18 22:33:13 · 402 阅读 · 0 评论 -
最长上升子序列(LIS)——玲珑学院OJ 1097
题目链接:http://www.ifrog.cc/acm/problem/1097分析:这题就是渡轮问题的改动版,还是用最长上升子序列来做,不过B序列中的一个点不止对应一个A序列中的一个点,而是最多6个点,那么我们就可以把B串中的每一个点用与之对应的A串中的6个点替换,并且按从大到小的顺序替换,用来保证每次只会在这6个点中选出一个点。AC代码:/************************原创 2017-03-04 21:32:34 · 370 阅读 · 0 评论 -
状压DP——ZOJ 3777
题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3777题意: 给出一个N*N的数字格,第 i,j 个数字表示第 j 道题放在第 i 个位置做的得分,求最终得分超过M的做题顺序有多少种分析: 因为N最大为12,若枚举长度为N的所有排列,一共有4亿多种,肯定会超时,所以我们会联想到状态压缩状态:用一个长度为N的原创 2017-02-16 11:10:54 · 565 阅读 · 1 评论 -
树形DP——POJ3513
题目链接: http://poj.org/problem?id=3513题意: 一家人去电影院,这一家人构成一个森林,每个森林都是一棵树。电影院有2种票:家庭票和个人票,买了家庭票,则自己的孩子可以不用买票(指下一代,不包括下下代..),买了个人票,则就是个人票。给出家人票和个人票的价格,求一种购票策略使得最终花费最小(花费相同,则求总票数最小)。最后输出个人票的数量,家庭票的数量和总花费。分析原创 2017-02-15 13:15:27 · 521 阅读 · 0 评论 -
状态压缩——hihoCoder 1087
题目链接: https://hihocoder.com/problemset/problem/1087题意: 给出一个N个点,M条边的有向图,求其中有多少条哈密顿回路分析:这道题非常直接的做法就是DFS搜索了,我们可以从任一顶点出发,不走重复点,若能回到顶点,那么哈密顿回路数量+1。但是直接暴力搜会超时,所以需要加上一个位运算的优化。位运算搜索:将邻接链表压缩成一个二进制串,第 i 位为1原创 2017-02-14 16:06:12 · 410 阅读 · 0 评论 -
DP(大容量背包的一种做法)—— POJ 1786
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1786题意:给出一个背包容量最大为1E9的背包,给出N(N<10)种物品,每种物品给出质量(不超过100),数量无限,每拿一次物品需要3s时间,求填满背包所需要的最小时间分析:这题看起来是一道普通的背包,但是背包容量太大,所以不可能直接将背包容量作为状态来做,我们需要另外找一个合适的量来作为状态。原创 2017-02-14 09:48:26 · 3163 阅读 · 0 评论 -
DP——HDU 5492
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5492题意: 给出一个N*M的矩阵,从(1,1)走到(N,M)会构成一个长度为N+M-1的序列,求 (N+M−1)∗∑N+M−1i=1(Ai−Aavg)2(N+M-1)*\sum^{N+M-1}_{i=1}(A_i-A_{avg})^2 分析: 式子转换成为 (N+M−1)∗(所有元素平方和)−原创 2017-02-21 21:10:42 · 310 阅读 · 0 评论 -
状压DP ( 预处理减少状态 )——炮兵阵地 (POJ 1185)
题目链接: http://poj.org/problem?id=1185分析: 这道题和POJ 3254很相似,不过因为它的条件改成上下左右的两块地方不能放置炮兵,又因为一行最多10格,所以需要先预处理一下每一行全是平地时候能放置炮兵的所有情况。 (之前直接开1<<10的二维数组,跑一下结果把ubuntu系统卡得都快没反应了)题解: 1.预处理一行放置炮兵的情况:int con[66]原创 2016-08-08 16:20:12 · 340 阅读 · 0 评论 -
DP——hihoCoder 1482
题目链接: https://hihocoder.com/problemset/problem/1482题意: 求你计算一个长度为N,且只包括3种字符 ‘O’, ‘L’, ‘A’,其中不能有连续3个L,最多只能有一个A的字符串的数量分析:限制条件是针对字符L和A的数量,那我们就用这个数量来表示状态。DP[i][j][k]DP[i][j][k]表示前i个字符包含j个A字符和结尾处连续k个L字符时,构原创 2017-03-19 17:34:10 · 440 阅读 · 0 评论 -
数位DP——Codeforces Beta Round #51 D. Beautiful numbers
题目链接: http://codeforces.com/problemset/problem/55/D分析: 定义Beautiful numbers为一个数x,x能整除它的十进制表示的每一位上的数字。求区间[L,R]内有多少个完美数字题解:这是一道标准的数位DP,将问题转化为求[1,x]内有多少个beautiful numbers。我们可以通过搜索计算出不同前缀下的数能包含多少个beautifu原创 2017-03-27 20:37:32 · 468 阅读 · 0 评论 -
数位DP——HDU 4352 XHXJ's LIS
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4352 题意:求出区间[L,R]内有多少个数字X,满足X上的所有位从左往右构成长度为K的严格递增子序列。原创 2017-03-27 23:49:17 · 439 阅读 · 0 评论 -
DP——HDU 4571
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4571题意:给出一个无向图(N个点,M条边,有重边),每条边有一个花费,每个节点有一个花费和一个价值(如果想获得价值,则必须付出花费,否则可以不用付出花费),求从点S到点E,在总花费不超过T的情况下的最大价值是多少分析:我们假设DP[i][j]表示从起始点到i点(并参观了i点)所达到的最大满意度。原创 2017-04-20 15:30:29 · 401 阅读 · 0 评论 -
背包——AtCoder Regular Contest 073 #D
题目链接:http://arc073.contest.atcoder.jp/tasks/arc073_b题意:01背包的题意,但是物品价值为1~1E7,物品质量为1~1E9,但是每个物品的质量范围为 [w1,w1+3][w_1,w_1+3] 。分析: 虽然物品质量很大,但是都是在 [w1,w1+3][w_1,w_1+3] 以内,所以我们很容易就能想到把 w1w_1 都提取出来。那么原来01背包的原创 2017-04-29 23:46:35 · 554 阅读 · 0 评论 -
DP——AtCoder Beginner Contest 050 #D - Xor Sum
题目链接:http://abc050.contest.atcoder.jp/tasks/arc066_b题意:求有多少个数字对<u,v><u,v>满足0≤u,v≤N0≤u,v≤N并且存在两个整数a,ba,b使得a+b=u,a xor b=va+b=u,a\ xor\ b=v分析:我们发现只要a,ba,b不超过NN,那么a xor ba\ xor\ b也不会超过NN,所以关键就是要保证a+ba +原创 2017-04-04 10:40:59 · 921 阅读 · 1 评论 -
记忆化搜索(字符串)——Kickstart 2017(Google Code Jam) A Round #B
题目链接: https://codejam.withgoogle.com/codejam/contest/8284486/dashboard#s=p1题意: 给出2个字符串A和B,判断2个字符串是否相等,字符串中可能含有’*’符号,这个符号可以与0~4个任意字符匹配上。分析: 我们可以发现一点就是,对于每一个’‘,我们可以选择让它匹配0~4个字符再对接下来的字符进行比对,那么我们可以直接搜索它分原创 2017-03-06 21:13:28 · 1419 阅读 · 0 评论 -
记忆化搜搜——Code Jam 2009 Round 1C #C Bribe the Prisoners
题目链接: https://codejam.withgoogle.com/codejam/contest/189252/dashboard#s=p2题意:给出一个长度为P的监狱,每个位置一个人,现在要释放Q个人,没释放一个人,要给他左右两边的连续有人的位置的人贿赂一枚金币,求释放这Q个人最少需要花费多少金币分析:初看这题和哈弗吗路径很像,其实不是,因为每释放一个人,相当于少了一个单位的长度,原创 2017-03-26 10:34:02 · 572 阅读 · 0 评论 -
概率DP——HDU 5236
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5236题意:现在有一个特殊的键盘,在 i+0.1i+0.1 秒可以输入一个数,在 i+0.9i+0.9 秒有 pp 的概率可能崩溃导致未保存的字符全部丢失,在ii秒可以选择保存,每次保存需要按下 xx 个键, 求输入N个字符在最优策略的情况下的期望按键次数。分析: 我们假设输入 ii 个字符的期望按键原创 2017-04-08 21:05:44 · 562 阅读 · 0 评论 -
DP——2008 APAC local onsites C Millionaire
题目链接: https://codejam.withgoogle.com/codejam/contest/32005/dashboard#s=p2题意:在一个赌博游戏中,初始有X元,总共玩M轮,每次你可以下一定赌注,有概率P赢:赌注翻倍;输:赌注就没了。求在M轮后总金额达到1000000以上的概率。(假设采取最优策略)分析:经分析,我们发现如果只有一轮的话,根据初始赌注的不同,最后达到目的的概原创 2017-03-29 22:47:03 · 845 阅读 · 0 评论 -
数位DP——POJ 3252 Round Number
题目链接 : http://poj.org/problem?id=3252题意: 求区间内 Round Number的数量,定义Round Number:转换为二进制数后0的个数大于等于1的个数的数分析: 直接当成二进制数位DP来做,需要注意的是要判断一下前导0。前缀就是保存末尾数字,前缀含有0的个数,前缀含有1的个数。AC代码/*******************************原创 2017-03-29 17:42:27 · 369 阅读 · 0 评论 -
DP——GDUT #E 绕远路
题目链接: http://gdutcode.sinaapp.com/problem.php?cid=1054&pid=4题意: 给出一个图,有重边和自环,不能从编号大的往编号小的走,求从点1到点n的不超过K的最长路分析:因为边的数量比较少,所以我们可以直接BFS来计算,对于有自环的路径,我们标记,然后在到达终点再统计,然后取最长路径。不过正解是动态规划,我们用DP[i][j]DP[i][j] 表原创 2017-03-22 10:04:29 · 341 阅读 · 0 评论 -
数位DP—— GDUT 等凹数字
题目链接: http://gdutcode.sinaapp.com/problem.php?cid=1057&pid=6题意:求出区间内等凹数字的个数,等凹数字:定义一种数字称为等凹数字,即从高位到地位,每一位的数字先非递增再非递减,不能全部数字一样,且该数是一个回文数,即从左读到右与从右读到左是一样的,仅形成一个等凹峰。分析:解析一个等凹数字需要满足的条件:必须下降过,必须上升过,必须是回文。原创 2017-03-28 13:44:33 · 1005 阅读 · 0 评论 -
状压DP——hihoCoder 1048
题目链接: https://hihocoder.com/problemset/problem/1048 题意:给出一个N*M的矩形盒子,往里面放入1*2大小的长方形蛋糕,问将这个盒子填满有多少种放法分析:这还是一个通过记录搜索结果来进一步枚举状态的题,我们通过从上往下搜索每一行,从左往右搜索每一格,每次的状态定义为当前行和下一行的放置情况,若当前格子放有蛋糕,则标记为1,否则为0,所以每次枚举的原创 2017-02-13 15:17:19 · 333 阅读 · 0 评论 -
记忆化搜索(DP)—— Balance (POJ 1837)
题目链接: http://poj.org/problem?id=1837题意: 有一个天平,左右臂各长为15,给出天平上C个挂钩的位置,再给出G个砝码的重量,问有多少种方法能使这个天平保持平衡分析:乍看一眼我们发现这道题只能通过枚举状态来计算结果,但是状态数非常之多(GCG^C 即 202020^{20}),不过大多状态都是重复的,所以我们可以通过把状态记录下来,减少计算量。因为左右力矩之和最原创 2017-02-13 13:54:11 · 378 阅读 · 0 评论 -
01背包(选择性)—— HDU 3466
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3466题意: 给出N个物品有P(价格),Q(现在金钱不小于Q才能购买),V(价值)三个属性,求在给定初始金钱M的条件下最大购买价值(Q>=P)分析:因为Q的属性为金钱不小于Q才能购买,那么就不能按照01背包那样随机拿了,我们要考虑尽可能购买更多的东西,即使能购买的东西最大,又购买了一件物品总金钱会减原创 2017-02-21 00:03:26 · 286 阅读 · 0 评论 -
状压DP——Corn Fields ( POJ 3254 )
题目链接: http://poj.org/problem?id=3254分析: 给出M行,N列的土地,1代表肥沃,0代表贫瘠,只能再肥沃的土地上种玉米并且不能相邻着种,问有多少中种植的方法。题解:1.这是一道状压DP的入门题,我们首先用一个一维数组记录每一个行肥沃徒弟的状态,把它记录为一个二进制数for(int i=1;i<=n;i++){ Map[i] = 0; for转载 2016-08-07 16:10:02 · 373 阅读 · 0 评论 -
DP——Two ( HDU 5791 ) ( 2016 Multi-University Training Contest 5 1011 )
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5791分析: 给出两串数字,求求它们有多少相同的子序列。题解: 确定DP方程: DP[i][j]表示A串前i个字符和B串前j个字符之间由多少相同的子序列,dp[i][j] = (dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1])%MOD;//加上前面的串的相同的子序列数原创 2016-08-02 21:28:14 · 288 阅读 · 0 评论 -
DP ( 滚动数组 )——Max Sum Plus Plus ( HDU 1024 )
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1024给出n个数,要求从中分出m段不重叠的子段,使得所有的子段和加起来最大。分析: 因为n的范围很大,最大为1,000,000,而m的范围未知,所以我们如果开二维数组来进行动态规划,很可能会爆内存,所以,我们采用一维滚动数组的方式,只记录需要记录的值即可。题解: 使用dp[j]记录分为i组,原创 2016-08-03 20:08:16 · 437 阅读 · 0 评论 -
数位DP——不用62和4 ( HDU 2089 )
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2089分析: 给出啊一个范围[n, m],求范围内不含62与4的数字个数。题解:定义dp[i][j]为长度为i ,最高位为j的不含62与4的数字的个数。DP代码:void init(){ memset(dp,0,sizeof(dp)); int i,j,k; dp[原创 2016-07-18 22:01:18 · 597 阅读 · 0 评论 -
最长递增子序列 ( LIS )——The All-purpose Zero ( HDU 5773 ) ( 2016 Multi-University Training Contest 4 1010 )
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5773分析: 给出N个数,其中0可以被替换成 0 ~ 9 的任何数字,问替换后这N个数的最长递增子序列的长度为多少?题解: 为了保证严格递增,我们把每一个数都减去这个数之前的0的个数,然后去掉0,做一次LIS求出长度,然后加上0的个数就是原来数列的LIS长度了。LIS模板:int DP[M原创 2016-07-28 22:09:57 · 492 阅读 · 0 评论 -
DP+KMP——Another Meaning ( HDU 5763 ) ( 2016 Multi-University Training Contest 4 1001 )
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5763分析: 每次给出两个字符串A和B,B可以被替换成*,在A中查找B,每一个B都可以进行替换,求一共能把A替换成多少种字符串。题解: 因为A字符串的长度为100000,所以答案最多会有2的100000这么多种,直接KMP会Bomb,ShaKaLaKa,因此需要用DP来做:DP[i]表示到第i原创 2016-07-28 21:02:23 · 386 阅读 · 0 评论 -
树形DP——Rebuilding Roads ( POJ 1947 )
题目链接: http://poj.org/problem?id=1947分析: 求最少删除多少边才能得到一颗含有P节点的子树。从根节点开始往下推能得出dp数组(见问题三)。题解:1.用vector建树,存储:for(int i=0;i<=n;i++) vec[i].clear(); //每次先清空vectorfor(int i=1;i<n;i++){ int a,b原创 2016-07-22 11:10:17 · 364 阅读 · 0 评论 -
树形DP——Party a Haili-Bula ( HDU 3342 )
题目链接: http://poj.org/problem?id=3342分析: 输入数据为字符串,需要与序号绑定,所以需要用到map容器。然后就是树形DP了。题解:1.MAP存储:map<string, int> names;map<string, int>::iterator it;int ADD(string x)//加入字符串{ int num; it = nam原创 2016-07-21 20:20:50 · 351 阅读 · 0 评论 -
树形DP总结
状态转移方程:题型一Q:给出一颗树,每个节点有其价值,如果父节点在,子节点就不能存在,然后求选哪些点能得到最大价值。A:从问题入手,先得出dp[i][j] 表示第i个节点,状态为j (0:不选,1:选)的情况下的价值。 然后再推导除出状态转移方程:dp[i][0] = max ( dp[i-1][1], dp[i-1][0] ) dp[i][1] = dp[i-1][0]题型二Q:给出一颗原创 2016-07-21 21:45:51 · 946 阅读 · 0 评论 -
数位DP——Bomb ( HDU 3555 )
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3555分析: 题意为给除一个数N,求出1-N这些数中含有49的子串的数的个数。初学数位DP,这道题就当例题了。题解:首先我们确定状态转移方程 dp[i][j]用于存储符合条件的数的个数i 代表目前处理的数长度为i这里dp[i][j]处理的数可以包含前导0dp[i][0]代表长度为i的数中原创 2016-07-18 17:06:10 · 470 阅读 · 0 评论 -
状压DP——Travelling ( HDU 3001 )
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3001分析:1.因为每个城市最多访问2次,所以用状态0,1,2记录某个城市被访问的次数,把1~N个城市的访问状态连在一起可以用一个三进制数记录。2.定义DP[i][j]中i为一个三进制数表示N个城市的访问情况,然后j表示目前访问到的城市序号,那么我们可以得出状态转移方程: dp[i+3v原创 2016-08-07 16:21:36 · 328 阅读 · 0 评论 -
DP——Hard problem (Codeforces Round #367 (Div. 2) C)
题目链接: http://codeforces.com/contest/706/problem/C分析: 给出n个字符串和把每个字符串翻转所需要的费用CiC_i,每个字符串都可以选择翻转或者不翻转,求将n个字符串变成字典序所需要的最小费用,若不能变成字典序则输出-1.字典序: 若在字典序上A在B前面则A是B的前缀 或者 A和B第一个不相同的字符是A[i]<B[i]。题解: 设dp[i][1原创 2016-09-09 17:15:02 · 284 阅读 · 0 评论 -
状压DP (Floyd+状态压缩 )——Hie with the Pie( POJ 3311 )
题目链接: http://poj.org/problem?id=3311分析: 给出n个点,标号从1到n,再给出一个(n+1)*(n+1)大小的矩阵,表示从i到j的花费时间,0代表出发点,从0出发,最后需要回到0,每个点必须都去过,可以重复走,求最短时间。题解: 1.先Floyd求一遍两点间最短路:void Floyd(){ for(int k=0;k<=n;k++)原创 2016-08-08 20:28:23 · 394 阅读 · 0 评论