ACM-动态规划
Helios_nannan
得失成败,都只对自己交代
展开
-
01背包详解
动态规划和贪心的区别先来看一个普通的题目:现在有一个容量为50的背包,超市中有几种商品,每种商品只有一件价值分别为vi,体积为wi,求在不超过背包容量的情况下取得的最大价值。 如果按照贪心的思想,就是去vi/wi最大的数,但是不是那样,我们先看下面的图就能理解: 基本思路这是个典型的01背包问题,每种物品有一件,可以选择放或者不放。 dp( i,j ) = Max( dp( i-1, j ),原创 2016-07-13 02:22:10 · 729 阅读 · 0 评论 -
poj 3254 Corn Fields 状压DP
传送门:poj 3254 Corn Fields题目大意给出一个M*N的矩阵,元素为0表示这个地方不能种玉米,为1表示这个地方能种玉米,现在规定所种的玉米不能相邻,即每行或者没列不能有相邻的玉米,问一共有多少种种植方法。举个例子:2 3 1 1 1 0 1 0 表示2*3的玉米地,现在一共有多少种种植方法呢? 答案:种0个玉米(算一个合法方案)+种1个玉米(4)+种2个玉米(3)+种3个玉米(原创 2016-08-02 00:45:48 · 402 阅读 · 0 评论 -
poj 2411 Mondriaan's Dream 经典状压DP+记忆化搜索
转送门:poj 2411 Mondriaan’s Dream题目大意给出一个n*m的棋盘,及一个小的矩形1*2,问用这个小的矩形将这个大的棋盘覆盖有多少种方法。解题思路因为对应于一个方格来讲,有两种状态放或者不放 对应于一个1*2的矩形来说有三种方式:横着放,竖着放,不放 因为列的数量为指数级别的,行为线性的,所以我们选取大的最为行,小的作为列 所有dp[i][j]就表示第i行状态为j的时候方原创 2016-08-02 01:14:47 · 422 阅读 · 0 评论 -
poj 2955 Brackets 区间DP
传送门:poj 2955 Brackets题目大意判断给定的字符串满足条件的个数,(由’[‘,’]’,’(‘.’)’构成的序列)解题思路dp[i][j]表示i到j这个区间的最大匹配数目! 这个dp[i][j]有两个状态专一的过程, 1. 如果i位置和j位置的括号是匹配的那么,转移方程就变为了dp[i+1][j-1] 2. 然后我们将这个区间拆分为两个区间,然后我们从小到大枚举i到j这个区间,每原创 2016-08-16 23:00:18 · 331 阅读 · 0 评论 -
hdu 5418 Victor and World 状态压缩+SPFA最短路
传送门:hdu 5418Victor and World题目大意给一个地图,从其中一个点开始走,遍历完所有的点后最后再回到这个点,求最短路径解题思路这个点数知识16所以很容易想到状态压缩! 我们用dp[i][j] 表示 状态为i的时候,结尾在j位置,状态转移方程为dp[S|(1<AC#include<cstdio>#include<cstring>#include<queue>#includ原创 2016-08-09 01:55:00 · 491 阅读 · 0 评论 -
hdu 2089 不要62 数位DP
传送门:不要62 中文题目不做过多的解释解题思路用dp[i][j]表示最高位是j的长度为i的有多少种满足要求的! 比如:dp[2][6] = 8;(60,61,63,65,66,67,68,69) 这里的情况是可以包含有前导0的,比如dp[3][0]表示从0开始长度为3的情况数目!这里就包括000~099这么多的情况!AC代码#include<cstdio>#include<cstring>原创 2016-08-20 21:27:04 · 472 阅读 · 0 评论 -
hdu 3555 Bomb 经典数位DP
传送门:Bomb题目大意给定一个整数N,求1~N中连续49的个数解题思路dp[i][0]表示长度为i位,不包含49的个数 dp[i][1]表示长度为i位,第一位是9的个数 dp[i][2]表示长度为i位,包含49的个数AC代码#include <cstdio>#include <cstring>#include <algorithm>#include <queue>#include <m原创 2016-08-22 22:25:49 · 466 阅读 · 0 评论 -
poj 2631 Roads in the North BFS/树状DP
传送门:poj 2631 Roads in the North题目大意输入边的两个顶点和权值,输出任意两个顶点的最远距离;解题思路这是一个裸的求树的直径的题目。 先说用BFS的方式,第一个BFS随便找一个顶点进行松弛,找到最远的一条路径并且记录下来那个顶点,因为这个距离肯定是包含在了最后的最长路径里面,所以在对刚才找到的那个节点进行一次BFS找到就是树的直径。AC代码#include<cstdio原创 2016-08-13 18:51:36 · 400 阅读 · 0 评论 -
poj 1655 Balancing Act 树状DP,求树的质心
传送门:Balancing Act题目大意有N个节点的无根树,每两个节点之间只有一条边,求删除一个节点之后最大的联通块(节点数最多)!解题思路先任意选择一个节点作为根节点,这样就能把一颗无根树变为有根树了,然后设sum[i]表示已i节点为根节点的子树的节点个数。 那么删除节点i会有多少个联通块呢? i节点有多少孩子节点就有多少联通块还有i的父节点也是一个联通块! 如下图所示: 比如说E节原创 2016-08-13 23:43:34 · 487 阅读 · 0 评论 -
CSU1817 Bones’s Battery 二分+Floyd+dp
题目大意有一辆汽车,在最开始的时候油箱是满油的,没经过一段路程就要浪费一定油量,问在保证能够遍历每个节点的通知油量的容量最少是多少。解题思路首先要二分答案,看到数据量这么大就很容易看出来,然后首先第一遍Floyd处理出每个任意一个节点到任意一个节点的最短距离,然后二分油量,我们设dp[i][j]从i节点出发到j节点能否到达,如果两点之间的最短路小于或者等于二分后的油量那么我们就设置dp[i][j]原创 2017-03-11 20:06:07 · 494 阅读 · 0 评论 -
CodeForces - 711C Coloring Trees 三维DP
题目大意输入nn,mm,kk,n表示有多少棵树,m表示有多少中颜色可以给树添加,k表示完美树的个数, 下面的n行表示给第ii棵树染色jj需要的花费,问把树染成k个完美树需要的最小花费。 第二行0表示该树没有颜色,其余表示树已经有该颜色了不能添加颜色了解题思路dp[i][j][k]dp[i][j][k]表示染完第ii棵树,使用的是jj燃料,完美数为kk的情况下的最小花费,很明显我们要根据当前书是否原创 2017-03-11 21:41:12 · 407 阅读 · 0 评论 -
NUOJ 737 石子合并(一)区间DP
传送门: 中文题目好理解解题思路我们把这个问题分为若干个子问题!先求两个合并的最小代价,然后求三个的,一直求到n个。dp[i][j]表示合并i石头到j石头花费的最小代价 所以状态转移方程为: dp[i][j] = min(dp[i][j],dp[i][k],dp[k+1][j]); 我们就可以从小都大枚举石头的数量知道合并完所有的就可以了!AC代码#include<cstdio>#incl原创 2016-08-16 22:41:07 · 385 阅读 · 0 评论 -
SGU 149 Computer Network 树状DP求单点到树的最大距离
传送门;Computer Network题目大意这个题目主要是输入理解了好长时间,不安正常的顺序出牌呀!! 第一行输入的是点的数量,下面的N-1行(从第二行开始),第一个数和第几行这个数相连,也就是和i相连。第二个数是权值!解题思路解题思路,这个和求树的直径是异曲同工的!第一个DFS中的dp[i][0]表示第i个节点到子树的最大距离,dp[i][1]表示第i个节点到子树的次长距离!然后第二个DFS原创 2016-08-16 12:55:20 · 559 阅读 · 0 评论 -
poj 1276 Cash Machine 多重背包
传送门:poj 1276 Cash Machine题目大意有各种不同面值的货币,每种面值的货币有不同的数量,请找出利用这些货币可以凑成的最接近且小于等于给定的数字cash的金额。 输入的前两个数表示背包容量,第二个数字表示有N种货币 接下来的N组两个数。第一个数表示货币数量,第二个数表示货币的价值 输出最接近并且小于等于背包容量的价值。解题思路在理解的01背包的基础上, 完全背包,指每个物品有原创 2016-07-13 13:07:56 · 313 阅读 · 0 评论 -
hdu 1231 最大连续子序列 DP
传送门:hdu 1231 最大连续子序列解题思路首先我们先要确定一下状态方程, 我们必须先要找到哪个子序列的和最大,所以dp[i]里面保存的是前i-1个中子序列中和最大的。 所以状态方程就能写出:dp[i] = max(a[i],dp[i-1]+a[i])其中a[i]表示的是输入的第i个数,如果a[i]<0的话,肯定是dp[i] = a[i]的所以这样就能保存了前i-1个中子序列的和的最大。通过原创 2016-07-16 00:47:45 · 1516 阅读 · 2 评论 -
hdu 2844 coins DP多重背包
传送门:hdu 2844 coins题目大意给定商品种类n和背包容量m以及对应的价值/容量和数量,求组合成不大于背包容量m有多少种可能。解题思路这是一个多重背包的题目,价值等于重量。我们根据每种硬币的价值和数量进行判断是转换为完全背包还是01背包。当一种硬币的(数量*价值)大于背包的总容量的时候,也就是相当于在不大于容量m的情况下该种物品满足完全背包的定义所以对于这一种物品来说使用完全背包的思想来求原创 2016-07-16 16:25:38 · 384 阅读 · 0 评论 -
hdu 1069 Monkey and Banana DP
传送门:hdu 1069 Monkey and Banana题目大意一堆科学家研究猩猩的智商,给他M种长方体,每种N个。然后,将一个香蕉挂在屋顶,让猩猩通过 叠长方体来够到香蕉。现在给你M种长方体,计算,最高能堆多高。要求位于上面的长方体的长要小于(注意不是小于于等于)下面长方体的长,上面长方体的宽小于下面长方体的宽。解题思路每一种长宽高不同的箱子来说,最多有六种摆放方式, 把这六种摆放的样式全部原创 2016-07-17 00:58:08 · 348 阅读 · 0 评论 -
ACdream 1216 Beautiful People 最长上升子序列变形
传送门:ACdream 1216 Beautiful People题目大意有n个人,分别对应着有拥有钱数ai和能力数bi,求ai和bi全部严格递增的子序列的数量,并且要求打印路径解题思路先将这个数组按照ai从小到大排序,如果ai相等的时候就按照bi的从大到小排序。这样一来就转换为求bi的最长上升子序列。 比如说下面这个例子: 1 10 2 12 2 11 2 10 3原创 2016-07-27 17:27:21 · 452 阅读 · 0 评论 -
hdu 1176 免费馅饼 二维动态规划
传送门:hdu 1176 免费馅饼 中文题目就不解释了解题思路这个题目是水DP题目,但是还有有一个难点就是找阶段,是选择位置是阶段还是时间是阶段好! 我们这两种阶段都讨论一下: 1. 位置是阶段也就是dp[i][j]表示i位置在j秒的掉饼数量,但是每一个阶段的状态又是和上一个阶段的状态有联系的。也就是这个阶段的状态中用到上一个状态的时间。所以假设这种阶段是不成立的 2. 时间是阶段,也就是d原创 2016-07-17 23:56:42 · 329 阅读 · 0 评论 -
hdu 2577 How to Type 经典DP
传送门:hdu 2577 How to Type题目大意给你一些字符串a~z||A~Z,然后我们按键最少能把他们都打出来,如果开始Cap大写灯是亮的,我们需要打a的话,可以按下cap键,然后再按a,需要两步,但是这下状态变为了大写灯亮,当然我们也可以按下shift,再按下a,需要两步,但是这下状态就变成了大写灯灭。题目要求的是,把这些字母打出来需要的最小按键数目。有一点需要注意,按键完成之后需要使c原创 2016-07-18 13:04:03 · 355 阅读 · 0 评论 -
51nod 1183 编辑距离 DP
传送门:51nod 1183 编辑距离 在题目中给定了一个定义,编辑距离,想要把a串变为b串对于a中的每个字符可以有三种操作:在a串中增加一个字符,删除一个字符,还有改变一个字符。 这就对应的一个阶段的三种状态 我们来设定阶段dp[i][j]表示a串中的前i个长度和b串中前j个长度中种编辑距离的最小值。 - 当i==0&&j==0的时候,也就是dp[0][0]是0 - 当i==0的时候也就原创 2016-07-18 21:48:45 · 369 阅读 · 0 评论 -
hdu 1054 Strategic Game 树状DP
传送门:hdu 1054 Strategic Game题目大意一城堡的所有的道路形成一个n个节点的树,如果在一个节点上放上一个士兵,那么和这个节点相连的边就会被看守住,问把所有边看守住最少需要放多少士兵。解题思路这是个典型的树形DP的题目! 1. 根—>叶:既根传递有用的信息给子节点,完后根得出最优解的过程。 2. 叶->根:既根的子节点传递有用的信息给根,完后根得出最优解的过程。这类的习题原创 2016-08-04 00:24:00 · 366 阅读 · 0 评论 -
sgu 143 Long Live the Queen 树状DP
传送门:sgu 143 Long Live the Queen题目大意:给出一棵树找出这个子树价值的最大值解题思路简单的树状DP,判断当前节点的子树,如果这个子树大于0就加上,如果小于0就放弃!AC代码#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int MAXN = 16000 +原创 2016-08-15 21:18:08 · 444 阅读 · 0 评论 -
poj 2677 双调欧几里得 dp
这个题目的思路可以参考小紫书的269页,动态规划初步那一章的思路。 这里虽然和书中描述的不一样,但是大致的思路是一样的: dp[i][j]表示两个人分别在i位置和j位置的最小花费,当前这一步有两个决策i选择或者j选择,所以状态转移方程如下: dp[i+1][j]=min(dp[i+1][j],dp[i][j]+dis(p[j],p[i+1]))dp[i+1][j] = min(dp[i+1][原创 2017-05-09 20:15:41 · 418 阅读 · 0 评论