
动态规划
文章平均质量分 72
外出散步
今天天气不错
展开
-
【转】动态规划之背包问题
March 1, 2013作者:Hawstein出处:http://hawstein.com/posts/dp-knapsack.html声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处。一切都要从一则故事说起。话说有一哥们去森林里玩发现了一堆宝石,他数了转载 2013-10-01 19:05:12 · 592 阅读 · 0 评论 -
UVa-674 - Coin Change 不同面值找零的方案数
674 - Coin ChangeTime limit: 3.000 secondsSuppose there are 5 types of coins: 50-cent, 25-cent, 10-cent, 5-cent, and 1-cent. We want to make changes with these coins for a given amount of mo原创 2013-11-04 17:56:42 · 1534 阅读 · 0 评论 -
nyoj-37-回文字符串
描述所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba"。当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串。现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。输入第一行给出整数N(0接下来的N行,每行一个字符串,每个字符串长度不超过1000.输出每行输出所需添加的最少字符原创 2013-11-22 20:50:40 · 1041 阅读 · 0 评论 -
hdu-1176- 免费馅饼 (C++与java实现
Problem Description都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼。说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内。馅饼如果掉在了地上当然就不能吃了,所以gameboy马上卸下身上的背包去接。但由于小径两侧都不能站人,所以他只能在小径上接。由于gameboy平时老呆在房间里玩游戏,虽然在游戏中原创 2013-11-25 21:01:42 · 1305 阅读 · 0 评论 -
poj-1322-Chocolate 使用动态规划求解的一种概率问题的算法
题目大意是说现有c种颜色的巧克力放在盒子里,每次可以从中取出一颗放在桌子上,每次取到每种颜色巧克力的概率是相同的(即1/c),如果刚取出的这颗的颜色与桌子上已有的某个巧克力的颜色相同,那么就把这两颗都吃掉,求解的是取了n次之后桌子上还剩下m颗巧克力的概率是多少。原创 2013-11-12 21:16:50 · 2063 阅读 · 1 评论 -
Nyoj-61 传纸条(一)(双线dp)
传纸条(一)时间限制:2000 ms | 内存限制:65535 KB难度:5描述小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了。幸运的是,他们可以通过传纸条来进行交流。纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,原创 2014-02-27 20:37:57 · 1052 阅读 · 1 评论 -
POJ-1243 One Person (经典级dp
题目大意:有一种猜数字的游戏,你有G次机会以及L点生命值,游戏首先给定一个范围1~N,你要来猜在此范围内的一个数字X。你的每次猜测都会告诉你是猜高了还是低了,每次猜测都要损失一次猜测机会(即G--),但如果你猜的值比X高了,那么同时还要损失一点生命值(L--)。现在主办人面临一个问题:若给定的范围太大,就有很有可能导致参赛者用尽机会和生命值也猜不到这个X;而范围太小的话又降低了趣味性。所以,需要你来帮忙,根据给定的G和L来确定一个尽量大的范围,同时确保该范围内的所有数字都是一定可以被猜到的。原创 2014-05-06 09:33:30 · 1140 阅读 · 0 评论 -
poj-1018 Communication System
题目大意:一条联通网络需要由n种设备组成,每种设备可以从不同的供应商处采购,每个供应商提供的不同设备都各有‘带宽’和‘价格’两种属性,现对于第i种设备,有mi个供应商可以提供。最终组成的联通网络的流量B为网络中最小的设备流量,而最终总花费P为所有设备的价格总和。显然是B越大、P越小越好。所以求B/P最大可以是多少。原创 2014-05-06 21:07:58 · 1023 阅读 · 0 评论 -
nyoj-712 探寻宝藏
探 寻 宝 藏时间限制:1000 ms | 内存限制:65535 KB难度:5描述传说HMH大沙漠中有一个M*N迷宫,里面藏有许多宝物。某天,Dr.Kong找到了迷宫的地图,他发现迷宫内处处有宝物,最珍贵的宝物就藏在右下角,迷宫的进出口在左上角。当然,迷宫中的通路不是平坦的,到处都是陷阱。Dr.Kong决定让他的机器人卡多去探险。但机器人卡多从左上角走到右下角时,只会向原创 2014-05-06 21:27:13 · 767 阅读 · 0 评论 -
Poj-1185 & Nyoj-81 炮兵阵地 (状态压缩动态规划经典题
#include#include#include#includeusing namespace std;int state[105],stn[105];long long int dp[105][105][105];int n,m,rem[105];int most,line;void find_all_state(){ most=0; line=1<<m; for(原创 2014-05-07 21:42:00 · 1015 阅读 · 0 评论 -
zzuli1430 多少个0 (dp递推
题目描述一个n*n的方格,每个格子中间有一个数字是2或者5,现在从方格的左上角走到右下角,每次只能选择向下或者向右移动一格两种移动方式,让所有经过的格子中的数字相乘,求使最后的结果中末尾处0的数字最少。输入第一行是一个正整数n(0<n<100)。接下来n行是一个n*n的矩阵。输出一个正整数m,表示最后的结果末尾处最少有x个0。样例输入42 5 2 55 2 5 22 5 5 52 2 2 2样例输出1原创 2014-04-23 10:06:01 · 956 阅读 · 0 评论 -
Poj-1160 Post Office(经典dp
Post OfficeTime Limit: 1000MS Memory Limit: 10000KTotal Submissions: 15258 Accepted: 8266DescriptionThere is a straight highway with villages alongside the high原创 2014-05-16 23:34:30 · 880 阅读 · 0 评论 -
hdu-1561 The more, The Better (树形dp入门,有依赖的背包问题
ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物。但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡。你能帮ACboy算出要获得尽量多的宝物应该攻克哪M个城堡吗?原创 2014-05-09 23:10:37 · 1651 阅读 · 0 评论 -
nyoj 16 矩形嵌套
有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度)。例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中。你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内。原创 2014-04-25 18:30:55 · 859 阅读 · 5 评论 -
Hdu-1565 方格取数(1) (状态压缩dp入门题
给你一个n*n的格子的棋盘,每个格子里面有一个非负数。从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大。原创 2014-05-17 01:29:46 · 1348 阅读 · 0 评论 -
nyoj-37 回文字符串(最长公共子序列算法应用
回文字符串时间限制:3000 ms | 内存限制:65535 KB难度:4描述所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba"。当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串。现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。输入第一行给出整数N(0原创 2014-04-25 19:01:05 · 877 阅读 · 0 评论 -
hdu1080 - Human Gene Functions 最长公共子序列推广
题目大意:对于两个给定的,由‘A’,'G',‘C','T'组成的序列,可以找到这两个序列之间的一个由对应字母确定的对应关系,不同的字母之间的对应可得到不同的权值(如题中表格)。例如:对于序列AGTGATG和GTTAG,一种可能的对应关系是 A G T G A T - G- G T - - T A G'-'代表空位。查表可知这种匹配方案得到的权值和为(-3)+5+5+(-2)+(-3)+5+(-3)+5=9而另一种方案:AGTGATG 与-GTTA-G可得到的权值和为(-3)+5+5+(-2)+5+原创 2014-04-25 09:39:36 · 976 阅读 · 0 评论 -
单调数
对于一个正整数x,如果x的每一位都不大于它右边一位上的数字,那么就称x是递增数,例如:112,4557,18899,111。类似的,如果x的每一位都不小于它右边一位上的数字,那么就称x是递减数,例如:986,6331,77311,111。递增数和递减数统称单调数。(111既是递增数,也是递减数,所以111肯定是单调数)原创 2014-04-13 19:41:18 · 1416 阅读 · 4 评论 -
nyoj-171-聪明的kk-数塔变形
原题:http://acm.nyist.net/JudgeOnline/problem.php?pid=171好吧,这道题只是把数塔斜过来了,如果没做过数塔的话还是先把数塔怎么解决搞懂,之后再来做这道题。首先可以想象把数塔三角形的顶点顺时针旋转成矩形的右下角,而数塔的高度则可以看成是行列的和再减一(想象不出来在纸上画下应该就能理解)还有要注意的是运行到了后半段的时候数塔就不再是以前的情原创 2013-11-01 14:18:33 · 756 阅读 · 0 评论 -
矩阵连乘(动规递推解决)
之前写了这道题的递归解法,虽说是做出来了,但现在想想其实就是对着别人的代码套下来的,当时自己对这道题的理解还是十分不够,最近开始认真学习dp,其实也是有点入门了的感觉,找书又看了这道题,终于有了更进一步的理解,自己又重新敲了一遍代码,感觉还是有收获的,不过对这道题仍然不敢说“理解”,现在终于知道,自己的水平还差得远呢。这是上次做这道题时写的博客http://blog.youkuaiyun.com/harr原创 2013-10-30 21:12:40 · 817 阅读 · 0 评论 -
动态规划:从新手到专家
March 26, 2013作者:Hawstein出处:http://hawstein.com/posts/dp-novice-to-advanced.html声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处。前言本文翻译自TopCoder上的一篇文章:转载 2013-10-01 19:06:43 · 756 阅读 · 0 评论 -
nyoj311-完全背包(01背包更深入理解)
本题与01背包类似,但存在两处不同:一、要求背包必须恰好装满,以此为前提下才考虑最大价值;二、给定的不再是物品数量,而是物品种类数,每类物品数量无限。回想01背包,运行初始时要将结果记录数组初始化为0,这一行为其实就代表着列出“有0个物品时,容量为i的背包(i=0,1,2.....)可以容纳的最大价值”,因为物品数为0,所以不论背包容量多大,答案都是0;再看本题,因为要原创 2013-10-05 20:44:22 · 652 阅读 · 0 评论 -
数塔
《算法竞赛入门经典》P158第一个例题是数塔,比较好理解,不过如果不是之前做过这道题的话估计还是会很纠结。一开始的方法貌似可以叫穷举,会造成重复计算,效率低;之后加入记忆,避免了重复计算。大概试着写出来对比了下,记录:#include#includeusing namespace std;int a[10][10],m[10][10];原创 2013-09-21 14:39:08 · 581 阅读 · 0 评论 -
数塔推广之矩形嵌套
前一篇是数塔,算是动规的入门,紧接着看到的一道题就是这个矩形嵌套,乍一看两道题似乎没啥联系,但仔细想想就发现两道题的思路有很多相似之处。数塔的每个节点最多只有两个子节点,在本题推广到多个;数塔每个节点权值不同,本题每个节点都只代表‘1’;数塔在存储时不需过多考虑,本题则需根据每个节点的长宽属性来建立图用以存储节点关系,之后的处理仅依靠图来运作,不再考虑节点的其他属性;。原创 2013-09-22 00:00:07 · 689 阅读 · 0 评论 -
矩阵链乘
题目地址:http://218.5.241.13:8060/oj/showProblem.jsp?pid=1104《算法导论》和《算法竞赛入门经典》中都有讲到的一道题,纠结了一阵子完全看不懂,打算放弃,转看《算法艺术与信息学竞赛》上的“括号配对”,因为之前在nyoj上见过这道题,又是纠结了好久,终于按着书上的伪代码AC了,没想到再回头看这道题立刻就思路清晰了,递归穷举加记忆解决~f(i,j原创 2013-09-27 22:30:06 · 914 阅读 · 0 评论 -
例9-3 硬币问题递推解
本题类似01背包问题,不过不同的是物品数量为不限,且没有权值,没啥好说的,烂代码备份#include#includeusing namespace std;int main(){ int max[100]; int min[100]; int v[100]; const int c=10; const int n=5; max[0]=min[0]=0;原创 2013-09-22 19:06:15 · 752 阅读 · 0 评论 -
poj3628-Bookshelf 2
。。。。。。。。。。。。。。。。。。不得不说,为了看懂这道题,我的想象力遭到了极大的挑战。。。大概翻译下吧:貌似是说有个蛋疼的农夫,要把他的牛摆到书架上(这是干毛!想象ing。。。),但是书架已经满了,只能把牛放到书架的顶上。。。每头牛高度不一样,不过每头牛高度都在1 到 1,000,000之间(尼玛,啥牛啊!而书架的高度一定 不会 比所有牛高度加起来更高,但也不会小于原创 2013-10-07 21:10:49 · 608 阅读 · 0 评论 -
UVA10405-Longest Common Subsequence && nyoj36-最长公共子序列
看了算法导论公开课第15集,就找了两道题来练习,可以参考01背包的表格记录方式解决,滚动数组方法还没试,有心情再说~~方法:x为长为m的序列,y长为n;用c[i,j]代表x[1,2,...i]和y[1,2,...j]这两个序列的最长公共子序列(LCS)的长度;那么c[m,n]即为题目所求;接下来是递推公式:哈哈~~大概就是这样,接下来说这两道题先原创 2013-10-07 20:15:07 · 964 阅读 · 0 评论 -
hoj2546-饭卡
分析题意可知,要最大程度的占便宜,就留出5元来买最贵的东西,若开始有m元,就按01背包来花m-5元~~不过要注意,若一开始卡里就不足5元(m烂代码备份~~#include#includeusing namespace std;int s[1005],v[1005];int main(){ int n,m; while(1) {原创 2013-10-07 20:44:09 · 550 阅读 · 0 评论 -
hoj-2602 终于算是把01背包告一段落,小总结
刚开始学动规,新手真是苦逼啊,纠结了两天,终于做到现在了。。。以hoj-2602题说明原题:http://acm.hdu.edu.cn/showproblem.php?pid=2602学01背包一开始是老师给讲了一些,之后是看着刘汝佳《算法竞赛入门经典》来的,不得不吐槽下这本书看得我真心纠结,现在回想一下都觉得佩服自己。。。(大概是我太笨了吧哈哈~~就这道题原创 2013-09-23 18:47:38 · 870 阅读 · 0 评论 -
nyoj79-拦截导弹
最长子序列,枚举并保存运行结果避免重复计算,类似斐波那契的解法烂代码备份 #include #includeusing namespace std;int a[22],s[22];int f(int i){ if(i==0) return 0; if(s[i]!=0) return s[i]; s[i]=1; for(int j=i-1;j>=1原创 2013-09-23 20:33:02 · 896 阅读 · 0 评论 -
nyoj 76-超级台阶
果然没啥意思,就是斐波那契,不过对1的规定导致少许的不同,递归记忆解决 #include #includeusing namespace std;int s[42];int f(int i){ if(!(s[i]<0)) return s[i]; s[i]=f(i-1)+f(i-2); return s[i];}int main(){ int n; c原创 2013-09-24 13:20:29 · 815 阅读 · 0 评论 -
hdu 1003-Max Sum
纠结的一道题,题目本身并不怎么难,不过正赶上这两天倒霉,折腾来折腾去的,现在才做出来题目大意是说给出一列整数,需要求出这列整数最大的并且要求连续的子序列,并要说明该子序列的起点与终点,若有多种答案的话则以第一个为准;一开始打算用打表,结果超时了,后来百度了下,大概整理下思路:初始化max为INF,sum为0用以临时保存子序列的和;依次读取数据v,判断su原创 2013-10-12 17:11:38 · 617 阅读 · 0 评论 -
nyoj 44-字串和
这道题相当于是hdu 1003-Max Sum的简化版,做一下算是复习~#includeint main(){ int num,n,g; scanf("%d",&num); while(num--) { scanf("%d",&n); int sum=0,max=-99999999; while(n--) { scanf("%d",&g); sum+原创 2013-10-12 19:20:39 · 484 阅读 · 0 评论 -
nyoj15-括号匹配(二)
没啥说的,只是看着《算法艺术与信息学竞赛》上的伪代码写的,侥幸AC,事实上还是理解的不够,先把烂代码备份到这,回头找时间重写(估计又是遥遥无期了。。。#include #includeusing namespace std;int main(){ string s,add; int num,v[105][105]; cin>>num; while(num--) {原创 2013-09-27 22:39:37 · 771 阅读 · 0 评论 -
nyoj15-括号匹配(二)//new,递归实现
之前做过这道题,不过做完了还是不怎么明白,今天换了种方法重新做了一遍,基本已经理解了,好吧,懒得多说,就这样。。。#include#include#includeusing namespace std;int s[105][105],num;string a,add;int f(int i,int j){ if(s[i][j]>=0) return s[i][j原创 2013-09-28 16:58:01 · 603 阅读 · 0 评论 -
nyoj17-单调递增最长子序列
没啥说的,果然跟“拦截导弹”的方法完全一样,烂代码备份#include #include#includeusing namespace std;int n,num;string v,add;int s[10005];int f(int i){ if(i==1) return 1; if(s[i]>0) return s[i]; s[i]=1; for(int原创 2013-09-28 16:05:07 · 602 阅读 · 0 评论 -
Poj - 3254 Corn Fields (状态压缩dp入门第一题(详解
题目大意:农夫有一块地,被划分为m行n列大小相等的格子,其中一些格子是可以放牧的(用1标记),农夫可以在这些格子里放牛,其他格子则不能放牛(用0标记),并且要求不可以使相邻格子都有牛。现在输入数据给出这块地的大小及可否放牧的情况,求该农夫有多少种放牧方案可以选择(注意:任何格子都不放也是一种选择,不要忘记考虑!原创 2014-04-08 11:38:04 · 9887 阅读 · 15 评论