动态规划
文章平均质量分 74
AlmostFree
这个作者很懒,什么都没留下…
展开
-
hdu 4517 floyd+记忆化搜索
题意:有n(100)个景点,m(1000)条路,时间限制为t(300),起点s,终点e。访问每个景点需要时间cost_i,每个景点的访问价值为value_i。点与点之间行走需要花费的时间为g[ i ] [ j ] 。注意点间可能有多条边。走到一个点时可以选择访问或者不访问,并且当前点的访问价值应该严格大于前一个访问的点。现在求,从起点出发,到达终点,在时间限制内,能得到的最原创 2015-08-19 13:33:53 · 353 阅读 · 0 评论 -
uva 10453 回文串dp uva 10739 uva 11151最长回文串 poj 3280
题意:给一个字符串,可以在任意位置插入任意字符,使其变成回文串。求最小插入的字符数,打印结果。解析:记忆化搜索和递归都可以。打印的时候递归。详细思路代码。代码:#include #include #include #include #include #include #include #include #include #inc原创 2015-04-04 17:35:49 · 380 阅读 · 0 评论 -
poj 3616 奶牛产奶时间间隔dp
题意:奶牛可以在1~n的时间内产奶,在这段时间内,fj有m个时间间隔可以助产奶,每次产过奶以后,奶牛要有r分钟的休息时间。现在给出m个时间的st ed 和 产奶量val,求满足以上条件下,奶牛产的最多的奶是多少。解析:dp[ i ]表示从第0个区间到第i个区间的最大产奶量。所以状态转移方程为:if (p[i].ed + r { dp[j]原创 2015-07-02 19:24:50 · 509 阅读 · 0 评论 -
poj 2385 来回走接苹果dp
题意:有两棵树,奶牛开始时在树1下,现在每分钟两棵树中的某一棵会下苹果,奶牛只可以移动w次。给每分钟下苹果的顺序,问奶牛最多能拿到多少苹果。解析:dp[ i ] [ j ] 表示的是在第i分钟,移动了w次拿到的最多苹果。因为奶牛初始在树1下,所以:dp[i][0] = dp[i - 1][0] + (a[i] == 1 ? 1 : 0);状态转移方程:dp[i][j原创 2015-06-29 21:52:59 · 488 阅读 · 0 评论 -
hdu 3001 3进制状态压缩dp,TSP
做这题前,先做poj3311,2进制的状态压缩dp,除了状态压缩不一样,剩下的都异曲同工。http://blog.csdn.net/u013508213/article/details/46367815题意:可以任选一个城市出发,每个城市可以经过两次,要求遍历所有城市之后回到这个任选的城市,求最小的花费。解析:因为每个城市可以经过两次,所以对于每一个城市,可原创 2015-06-05 08:43:29 · 361 阅读 · 0 评论 -
poj 2229 2的次方个数dp
题意:给一个数n,求用2的t次方的数来加成这个数,能有几种方法。结果对1e9取模。e.g:7可以有以下6种加法:1) 1+1+1+1+1+1+12) 1+1+1+1+1+23) 1+1+1+2+24) 1+1+1+45) 1+2+2+26) 1+2+4解析:当i为奇数的时候:dp[i] = dp[i - 1]就是直接+个1就到原创 2015-06-24 17:16:38 · 408 阅读 · 0 评论 -
poj 3311 2进制状态压缩dp,tsp
题意:TSP,每个点只能经过一次。解析:2进制状态压缩dp,1表示当前点访问过,0表示未访问过。dp[ j ] [ state ] 表示起点为 j ,状态为 state 时的最小花费。状态转移方程:dp [ j ] [ state ] = min ( dp[ j ] [ state ], dp[ k ] [ state ^ (1 意义是,从 之前没有加入 j原创 2015-06-04 21:45:28 · 537 阅读 · 0 评论 -
uva 10154 DP 叠乌龟
题意:给你几只乌龟,每只乌龟有自身的重量和力量。每只乌龟的力量可以承受自身体重和在其上的几只乌龟的体重和内。问最多能叠放几只乌龟。解析:先将乌龟按力量从小到大排列。然后dp的时候从前往后叠,状态转移方程:dp[i][j] = dp[i - 1][j]; if (dp[i - 1][j - 1] != inf && dp[i - 1][j原创 2015-03-27 20:50:41 · 608 阅读 · 0 评论 -
usaco 1.1 Broken Necklace(DP)
直接上代码 接触的第一道dp 果然自己水的飞起/*ID: who jayLANG: C++TASK: beads*/#include#include#includeusing namespace std;int main(){ char str[702],temp[351]; int i,n; int bl[705],rl[原创 2014-01-29 10:58:45 · 684 阅读 · 0 评论 -
poj 2677 双调旅行商dp
题意:题意就是双调旅行商。John uses the following strategy: he starts from the leftmost point, then he goes strictly left to right to the rightmost point, and then he goes strictly right back to the starting p原创 2015-05-10 15:46:11 · 534 阅读 · 0 评论 -
uva 10617 回文串个数
题意:给一个字符串s,可以添加删除,问共有多少种方法把s变成回文串。解析:状态转移方程:for (int i = len - 2; i >= 0; i--)//这样才能保证i + 1已被计算过。 { for (int j = i + 1; j < len; j++)//这样才能保证 j - 1已被计算过。 {原创 2015-04-06 11:11:51 · 633 阅读 · 0 评论 -
uva 10604 化学药品链式dp
题意:给一堆化学药品,可以相互反应,反应会产生热量,或消耗热量。给每种化学药品的个数,求最终能达到的最低温度。解析:数量较少,直接dfs。代码:#include #include #include #include #include #include #include #include #include #include #include原创 2015-04-06 10:49:31 · 405 阅读 · 0 评论 -
uva 10651 状态压缩DP
题意:给一串珠子-0-0-0-----00-----这样表示。然后可以这样跳:解析:因为题目数量级较小,可以用dp的状态压缩通过位运算来做。一般涉及到的位运算是 ^ 和 &。因为^的性质是 同0不同1,比较方便。代码:#include #include #include #include #include #include #incl原创 2015-04-06 14:02:54 · 365 阅读 · 0 评论 -
uva 10635 nlogn LIS
题意:题目这么长还画了一个图来唬人!LIS解析:nlogn的LIS,二分实现。代码:#include #include #include #include #include #include #include #include #include #include #include #include #define LL long原创 2015-04-06 12:51:30 · 366 阅读 · 0 评论 -
uva 10564 沙漏
题意:如图走这个沙漏,给沙漏的大小和一个数字s,问最后有多少条路可以到达底部使得沙漏路径和为s。若有多条路径,打印起点最低的,that means ,打印第一行最靠左边的路。解析:自己一直TLE,看了一个大牛的代码。他是这样处理的:因为上下沙漏走左右是不同的,上沙漏往下走的时候,向左是( i + 1, j - 1 )向右是( i + 1, j );而当走到下原创 2015-04-06 09:36:29 · 412 阅读 · 0 评论 -
uva 10465 简单dp标记
题意:给两种汉堡一种吃要n分钟,一种m分钟,现在有t的时间。问最多能吃多少个汉堡,如果有剩余时间,输出剩余时间。解析:简单的标记扫一遍,最后倒回来判断就好了。详见代码。代码:#include #include #include #include #include #include #include #include #include #原创 2015-04-05 10:36:15 · 361 阅读 · 0 评论 -
poj 1742 多重背包入门
题意:给n种硬币的价值和数量,求能凑成【 1, m】之间的多少个数。解析:完全背包的入门题。用dp[ i ] = 0 表示 i 这个数不能凑成;dp[ i ] = 1表示 i 这个数能凑成。然后每种数量用多重背包的二进制来拆分,最后遍历一遍即可。代码:多重背包(01、完全):int packV;int n;int dp[maxv];//原创 2015-07-12 09:33:54 · 481 阅读 · 0 评论 -
XTU 1233 n个硬币连续m个正面个数(dp)
题面:CoinsProblem Description:Duoxida buys a bottle of MaiDong from a vending machine and the machine give her n coins back. She places them in a line randomly showing head face or tail face o原创 2015-06-14 21:46:43 · 985 阅读 · 0 评论 -
poj 3046 数蚂蚁 dp
题意:蚂蚁们有T个家庭,共有A只蚂蚁。用只数来分组,问从s只到b只总共有多少中分配方案。解析:用一维的想法一直想,真是糊涂了。dp[ i ] [ j ] 表示 前 i 个家庭,凑成每j只蚂蚁一组总共有多少种分法。状态转移方程:dp[ i ] [ j ] = sigema( dp[ i - 1 ] [ j - k ] ),其中k从0到family[ i原创 2015-07-13 16:40:47 · 465 阅读 · 0 评论 -
hdu 5000 dp+猜
题意:给n(2000)个T [ i ],1 每个T代表着一个能力,可以取值为[ 0 , T[i] ]。每个人有n个能力,如果这个能力的值全部都大于等于另一个人的能力,则另一个人就不能生存了。现在给出所有能力的最大值T[i],问最多能留下多少人共存。解析:想要共存,就要把这些人都凑开,一项能力大,一项能力小这样子。然后开始我一直wa,因为猜想的地方错了,开始的猜想原创 2015-09-01 12:09:34 · 391 阅读 · 0 评论 -
hdu 2082 多重背包简化版
题意:26个单词,他们的价值为1~26,现在给出他们的个数,求凑成价值50以下的单词有多少种凑法,单词无序。解析:dp[ i ][ j ] = ∑ dp[ i - 1 ] [ j - k * value[i] ]代码:#pragma comment(linker, "/STACK:1677721600")#include #include #include原创 2015-08-18 10:38:27 · 393 阅读 · 0 评论 -
poj 3171 rmq+dp
题意:有n头牛,分别愿意在[fr, to] 的时间间隔内打扫卫生,打扫收费val元。然后FJ想要在[S. E]的时间段内,都有牛在打扫卫生。问他的最小花费是多少。解析:状态转移方程:dp[end_i] = min(dp[end_i], min(dp[start_i] ~ dp[end_i]) + salary_i)然后min(dp[start_i] ~ d原创 2015-08-11 23:28:07 · 421 阅读 · 0 评论 -
poj 2392 完全背包变形
题意:有k个blocks,每个具有高度 h,量 cnt 个,并且拼凑成的块不能超过高度 hmax。现在问,这些块最高能叠多高。解析:完全背包的变形。首先对所有块按照他们各自的最大高度排序,这样完了以后每次所使用的 hmax,就是当前最大的,相当于完全背包里面背包的容量了;然后用 dp [ i ] 来表示 当前 高度 i 可不可叠成,用 sum [ i ] 来表示 当原创 2015-07-18 08:58:24 · 447 阅读 · 0 评论 -
poj 2411 2663 2420 dp+dfs+矩阵快速幂(1*2矩形排版次数)
从这篇博客学到很多:点击打开链接直接枚举高的状态,一旦此状态确定了,之后的状态就都确定了。poj2411:题意:给定一个长宽小于等于11的矩形,问用1×2的小矩形填满,有多少种方法。代码:#include #include #include #include #include #include #include #include #i原创 2015-08-10 20:30:48 · 700 阅读 · 0 评论 -
poj 3666 数组整单调 dp
题意:给 n 个数的数组,现在要求你把数组整理成单调的,增或者减。每次改变有一个花费 abs(a - b),现在问你最小的花费是多少。解析:dp[ i ] [ j ] 表示的是前 i 个数,末尾数为 num[ j ] 时 ,整理成单调数组的最小花费。这题其实直接一个遍历就能求出不管是整理成单调增,或者单调减了,因为我是枚举 num[ j ] 来搞dp的。状态转移方程原创 2015-07-17 14:35:06 · 696 阅读 · 0 评论 -
poj 2184 01背包变形
题意:有k组数,Si 和 Fi,s和f的范围是 【 -1000, 1000】。现在要挑选其中的一些组,使所选的组 Si的和 与 Fi的和 的和 最大, 并且 Si 的和 不能小于0,Fi 的和 也是。问 满足条件的 最大的 Si 的和 与 Fi 的和 的 和。。。。。。。解析:01背包的变形。首先将 Si 看做每个物品的费用,Fi 看做体积。然后由于有负数出原创 2015-07-18 10:03:10 · 382 阅读 · 0 评论 -
poj 1065 最长上升子序列
题意:有n支木棍,每只木棍有一个长度 l 和 重量 w。每次处理第一只木根的时候要消耗 1 的时间,紧接其后的木棍们,若满足 l 和 w 都大于当前的木棍,可以不用消耗时间。问在这样的条件下,合理安排木棍处理顺序,时间最小是多少。解析:先间 l 从小到大排序,然后求 w 的上升子序列,每次求完标记就行了。代码:#include #include #i原创 2015-07-16 22:51:36 · 400 阅读 · 0 评论 -
poj 2836 子集 状态压缩dp
题意:坐标平面上有n各点,用任意大小(非零)的矩形覆盖它们,求最省的矩形的总面积。解析:预处理,将n个点两个两个组合构成多个矩形,然后将在矩形内部的点更新进矩形中。然后就是dp的过程了:dp[0] = 0。初始时集合中没有点,并且面积为0。dp[nowS] = min ( dp[nowS], dp[s] + area)。当前的点集的矩阵取,还是不取。原创 2015-08-10 15:00:38 · 512 阅读 · 0 评论 -
poj 1631 nologn LIS
题意:求LIS。代码:#include #include #include #include #include #include #include #include #include #include #include #include #include #define LL long long#define lson lo, mi, rt << 1原创 2015-07-17 08:49:27 · 350 阅读 · 0 评论 -
hdu 4576 概率dp
题意:有个机器人,然后给你一个1~n的环:机器人初始的时候在1,现在给你m(1e6)个操作,每次操作给出一个步数x,机器人可以等概率的选择顺时针或者逆时针走x。现在问你,m次操作以后,机器人停落在 [ l, r ] 区间的概率是多少。解析:状态转移方程,come on滚动数组滚起来,( ̄Q ̄)╯。dp[cur ^ 1][runClock(i, x)] +原创 2015-08-24 15:52:06 · 296 阅读 · 0 评论 -
poj 3254 种玉米 状压dp
题意:有一块n*m(12)的玉米地。每块地的情况用0和1来表示,0代表贫瘠,1代表肥沃,可以在肥沃的土地上种玉米。现在问有几种方法来种玉米,使得每块玉米地都是没有邻接的。e.g:2 31 1 10 1 0Number the squares as follows:1 2 3 4 There are four ways to plant only o原创 2015-08-10 13:36:10 · 421 阅读 · 0 评论 -
poj 2441 状态压缩+滚动数组+剪枝DP
题意:有n(20)只牛和m(20)个篮球场,每个篮球场只能一只牛打,然后每只牛都有自己喜好的篮球场。现在问有多少种分配方法使得每只牛都能在自己喜欢的篮球场打球,并且这个球场只有它一只牛。解析:竟然是不用分配每只牛- -首先是状压:dp[ i ] [ state ] 表示的是第i只牛球场状态为state时的分配方法数。状态转移方程也很好推:dp[ i ] [原创 2015-08-10 10:34:09 · 554 阅读 · 0 评论 -
poj 1796 线段树+dp
题意、解析:见《挑战》P206书上代码不全,此处完全为了记录代码。代码:#include #include #include #include #include #include #include #include #include #include #include #include #include #define LL long long原创 2015-07-27 16:29:07 · 430 阅读 · 0 评论 -
poj 3181 数钱dp + 特殊技巧解决大数加法
题意:问用1 - k 面值的钱来凑成 n 元钱有多少种方法。解析:状态转移方程好推:dp [ i ] [ j ] 表示用 1 - i 面值的钱来凑成 j 元有多少种方法。dp [ i ] [ j ] = sigema(dp[ i - 1] [ j - k ]) 其中 k 从 i 2i 3i ...........意义是:用当前 i 面值的钱去凑 j 元钱,方法数为用原创 2015-07-14 08:09:49 · 344 阅读 · 0 评论 -
uva 10534 nlogn最长上升子序列
题意:给一个组数,求递增到递减的最长序列。e.g 1 2 3 4 5 6 5 4 3 2 1 就是一个长度为11的序列。解析:1e4的数据量,nlogn的最长上升子序列的处理方法。正向扫一遍,找递增,反向扫一遍,找正向递减。最后比较,mymax = max(mymax, min(cnt1[i], cnt2[i]))。然后ans = mymax * 2 - 1 就原创 2015-04-05 11:05:39 · 381 阅读 · 0 评论 -
uva 10401 受伤的皇后dp
题意:国际象棋中,皇后受伤了,只能像如图一样攻击。给一个已经摆放好的序列,这样的棋盘上摆上皇后,共有多少种摆放方法。解析:从左到右扫一遍,最后把所有上到下格子合并就好。dp[i][j] 表示第i列第j行有多少种摆放方法。详见代码。代码:#include #include #include #include #include #inclu原创 2015-04-04 09:47:44 · 522 阅读 · 0 评论 -
uva 111 (LCS)
题意:给一个标准时间,给若干个排序时间,问最长公共子序列长度。解析:状态转移方程:if (time[i - 1] == num[j - 1]){ dp[i][j] = dp[i - 1][j - 1] +1;}else{ dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);}本题需要注意的是题目给的数字是排序点,原创 2015-03-12 08:30:41 · 366 阅读 · 0 评论 -
uva 103 (DAG矩形嵌套最长路)
题意:给一个n维的东西,若一个的n维都小于另一个的n维,则其可嵌套。求最长可嵌套的有几个,并打印出路径。解析:DAG上的最长路,先将可嵌套的图标记g[i][j] = 1,然后枚举起点记忆化搜索扫一遍就行了。打印的时候,找到起点,打印即可。代码:#include #include #include #include #include #inclu原创 2015-03-11 20:59:48 · 500 阅读 · 0 评论 -
uva 662 (经典DP邮局问题)
题意:给在一条直线上的n个汉堡店,以及每个汉堡店在x轴上的坐标。求建m个供应产,使得每个汉堡店到m个供应产的距离和最小。解析:经典的邮局dp问题。首先需要知道到达几个村庄的最小距离和是这几个村庄的坐标中点。先用一个遍历找出所有i j之间的所有最小距离,然后再dp。状态转移方程:dp[ i ] [ j ] = min ( dp[ i ] [ j ] , d原创 2015-03-17 16:06:12 · 1019 阅读 · 0 评论 -
uva 624 (01背包打印路径)
题意:给张磁带,可以录c分钟的歌,然后给n首时间为vi的歌,问这张磁带最长可以录多少分钟的歌,并打印。解析:磁带长度为背包容量,每首歌为每个物品,歌的长度为物品重量,每首歌价值也为物品重量。状态转移方程:dp[ i ] [ j ] = max(dp[ i - 1 ] [ j ], dp[ i - 1 ] [ j - v[i] ] + v[i])dp[i][j]表示原创 2015-03-17 09:08:47 · 398 阅读 · 0 评论