动态规划刷题集锦
文章平均质量分 61
动态规划是运筹学的一个分支,是求解决策过程最优化的数学方法。美国数学家R.E.Bellman等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理,把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。
TOP-SECRET
这个作者很懒,什么都没留下…
展开
-
C++动态规划算法之子集的和
子集的和题目描述对于从1到N (1 举个例子,如果N=3,对于{1,2,3}能划分成两个子集合,他们每个的所有数字和是相等的:{3} and {1,2} 这是唯一一种分法(交换集合位置被认为是同一种划分方案,因此不会增加划分方案总数)如果N=7,有四种方法能划分集合{1,2,3,4,5,6,7},每一种分发的子集合各数字和是相等的:{1,6,7} 和 {2,3,原创 2017-06-16 13:23:43 · 1955 阅读 · 0 评论 -
C++动态规划算法之计算字符串距离
计算字符串距离Description对于两个不同的字符串,我们有一套操作方法来把他们变得相同,具体方法为:修改一个字符(如把“a”替换为“b”)删除一个字符(如把“traveling”变为“travelng”)增加一个字符(如把“son”改成“song”)比如对于“abcdefg”和“abcdef”两个字符串来说,我们认为可以通过增加/减少一个“g”的方式来达到目的。无原创 2017-07-13 09:49:35 · 2870 阅读 · 0 评论 -
最短编辑距离
1.最短编辑距离的介绍①基本定义 所谓编辑距离(Edit Distance),是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作总共有三个:将一个字符替换成另一个字符、插入一个字符或者删除一个字符。讲道理的话,编辑距离越小,两个字符串就越相似。对了,它又叫作Levenshtein距离,因为这个概念是在1965年由俄罗斯科学家Vladimir L原创 2017-07-12 17:59:35 · 2412 阅读 · 3 评论 -
C++动态规划算法之数字金字塔【USACO TRAINING】:一道经典的数塔问题
数字金字塔题目描述考虑在下面被显示的数字金字塔。 写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大。每一步可以走到左下方的点也可以到达右下方的点。在上面的样例中, 从7到3到8到7到5的路径产生了最大和:30输入第1行:1个整数R(1接下来共R行,第i行有i个整数。所有的数均非负的且不大于100。原创 2017-08-21 16:19:23 · 7001 阅读 · 2 评论 -
C++递归算法之菲波拉契数列
菲波拉契数列:菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。给出一个正整数a,要求菲波那契数列中第a个数是多少。代码如下:#includeint a;int fibonacci(int x) //递归函数{ if(x==1||x==2) return 1; //满足边界条件,递归返回 else return fibonacc原创 2017-05-22 06:14:36 · 1531 阅读 · 0 评论 -
C++递归递推算法之三角形划分平面区域
三角形划分平面区域Description1个三角形将平面划分成内、外 2 个区域。2 个三角形最多将平面划分成 8个区域,如下图所示。给定三角形数量 n,求 n 个三角形最多将平面划分成多少个区域。Input第1行:1个整数n(0Output第1行:1个整数,表示最多划分的平面区域数量Hint0思路解析原创 2017-07-15 12:01:25 · 1340 阅读 · 0 评论 -
C++记忆化搜索算法与动态规划算法之公共子序列
公共子序列Description我们称序列Z = 1, z2, ..., zk >是序列X = 1, x2, ..., xm >的子序列当且仅当存在 严格上升 的序列< i1, i2, ..., ik >,使得对j = 1, 2, ... ,k, 有xij = zj。比如Z = 是X = 的子序列。现在给出两个序列X和Y,你的任务是找到X和Y的最大公共子序列,也就是说要找原创 2017-07-10 16:06:13 · 1861 阅读 · 0 评论 -
C++动态规划算法之采药
采药Description辰辰是个很有潜能、天资聪颖的孩子,他的梦想是称为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到原创 2017-07-10 12:04:22 · 2066 阅读 · 0 评论 -
C++动态规划算法之Maximum sum(最大和)
Maximum sum(最大和)DescriptionGiven a set of n integers: A={a1, a2,..., an}, we define a function d(A) as below: t1 t2 d(A) = max{ ∑ai + ∑aj | 1 <= s1 <= t1 <原创 2017-07-11 11:36:58 · 4543 阅读 · 0 评论 -
C++递归算法之爬楼梯
爬楼梯Description树老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数例如:楼梯一共有3级,他可以每次都走一级,或者第一次走一级,第二次走两级也可以第一次走两级,第二次走一级,一共3种方法。Input输入包含若干行,每行包含一个正整数N,代表楼梯级数,1 Output不同的走法数,每一行输入对应一行输出Sample Input5810原创 2017-07-04 18:39:32 · 7002 阅读 · 0 评论 -
C++递归算法之鸣人的影分身
鸣人的影分身Description在火影忍者的世界里,令敌人捉摸不透是非常关键的。我们的主角漩涡鸣人所拥有的一个招数——多重影分身之术——就是一个很好的例子。影分身是由鸣人身体的查克拉能量制造的,使用的查克拉越多,制造出的影分身越强。针对不同的作战情况,鸣人可以选择制造出各种强度的影分身,有的用来佯攻,有的用来发起致命一击。那么问原创 2017-07-06 14:11:33 · 1430 阅读 · 0 评论 -
C++递归算法之分成互质组
-分成互质组-Description给定n个正整数,将它们分组,使得每组中任意两个数互质。至少要分成多少个组?Input第一行是一个正整数n。1 。第二行是n个不大于10000的正整数。Output一个正整数,即最少需要的组数。Sample Input614 20 33 117 143 175Sample Out原创 2017-07-09 09:23:16 · 3886 阅读 · 2 评论 -
C++动态规划算法之怪盗基德的滑翔翼
怪盗基德的滑翔翼Description怪盗基德是一个充满传奇色彩的怪盗,专门以珠宝为目标的超级盗窃犯。而他最为突出的地方,就是他每次都能逃脱中村警部的重重围堵,而这也很大程度上是多亏了他随身携带的便于操作的滑翔翼。有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却被柯南小朋友识破了伪装,而他的滑翔翼的动力装置也被柯南踢出的足球破坏了。不得已,怪盗基德只能操作受损的滑翔翼逃脱原创 2017-06-13 14:00:30 · 1888 阅读 · 0 评论 -
C++广度优先搜索算法之迷宫问题
迷宫问题Description定义一个二维数组: int maze[5][5] = {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0,};它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下原创 2017-06-12 13:41:58 · 3645 阅读 · 0 评论 -
C++动态规划算法之最长上升子序列
最长上升子序列Description一个数的序列bi,当b1 b2 bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1,a2, ..., aN),我们可以得到一些上升的子序列(ai1,ai2, ...,aiK),这里1 <=i1 i2 < ... <iK 你的任务,就是对于给定的序列,求出最长上升子序列的长度。Input输入的第一行原创 2017-06-11 22:35:11 · 2034 阅读 · 0 评论 -
C++动态规划算法之拦截导弹
拦截导弹Description某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最原创 2017-06-11 22:46:25 · 6557 阅读 · 0 评论 -
C++递归算法之2的幂次方表示
2的幂次方表示:任何一个正整数都可以用2的幂次方表示。例如: 137=27+23+20同时约定方次用括号来表示,即ab可表示为a(b)。由此可知,137可表示为: 2(7)+2(3)+2(0)进一步:7=22+2+20(21用2表示) 3=2+20所以最后137可表示为: 2(2(2)+2+2(0))+2(2+2(0))+原创 2017-05-22 13:43:41 · 9944 阅读 · 5 评论 -
C++递推算法之菲波拉契数列
菲波那契数列:菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。给出一个正整数a,要求菲波那契数列中第a个数是多少。代码如下:#includeusing namespace std;int a,b[1000005]={0,1,1};int main(){ cin>>a; for(int j=3;j<=a;j++) b[原创 2017-05-25 13:39:51 · 1987 阅读 · 0 评论 -
C++递推算法之放苹果
放苹果:把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。#includeint main(){ int i,j,k,n,m; int t; scanf("%d",&t); for(int o=1;o<=t;o++) { int f[101][101]; scanf("%d%d",&m原创 2017-05-26 13:06:00 · 5284 阅读 · 0 评论 -
C++递归算法之放苹果
Description把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。Input第一行是测试数据的数目t(0 Output对输入的每组数据M和N,用一行输出相应的K。Sample Input17 3Sample Output8#includeint main(){ int i,j,k原创 2017-05-28 15:33:03 · 1816 阅读 · 0 评论 -
C++之小学奥数(2)
求出第k小排列题目描述给出两个正整数n,k(n//也就是说要求全排列出来后的第k个数输入只有一行:两个整数,n(n输出输出该排列样例输入4 3样例输出1324题目分析当n==4时,所有的全排列(数)如下:1234,1243,1324,1342,1423,1432;2134,2143,2314,2341,241原创 2017-06-03 15:37:59 · 2376 阅读 · 0 评论