sdau-3-DP动态规划
文章平均质量分 51
wolf__L
如果有来生,要做一棵树,站成永恒,没有悲伤的姿势:一半在尘土里安详,一半在空中飞扬;一半散落阴凉,一半沐浴阳光。非常沉默非常骄傲,从不依靠从不寻找。
展开
-
Problem-M
概述:有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。求某一年共有多少头牛。思路:在前三年按照每年一头增加,从第四年开始,第四年生的牛对应第二年有的牛,第五年生的牛对应第三年有的牛,以此类推,fn = f3 + f1;f1 = f2; //f1代表前3年f2 = f3; //f2代表前2年f3 = fn; //f3代表前1年。可解。原创 2016-04-26 20:43:24 · 271 阅读 · 0 评论 -
Problem-O
概述:将一个十进制数转换为二进制。思路:利用辗转取余,不断取余。感想:开始时候用一般的数组做的,结果发现在处理转换过程中出现的0的时候不好处理,毕竟不知道有多少位,所以用了vector数组,但是在最后输出是出了问题,辗转取余时候产生的数字是倒置的,最后输出需要倒置过来,自己解决不了这个问题,找同学问,利用了反向迭代器,学会这个方式,解决。#include#include#inclu原创 2016-05-07 22:01:59 · 197 阅读 · 0 评论 -
Problem-N
概述:用折线切割平面,求n条折线最多能切出多少平面。思路:在高中学过的推理规律,f(x)=f(x-1)+4(x-1)+1,来由是切割平面数=交点数+顶点数+1。感想:从高中数学规律推理这道题,在将规律总结归纳,得到2*x*x-x+1.推理过程用了高中的等差数列的知识,所以这个题就现在来讲只是不熟悉。。#include#includeusing namespace std;in原创 2016-05-07 22:27:34 · 205 阅读 · 0 评论 -
Problem-K
概述:六角形的蜂房,小蜜蜂从某个蜂房走向另一个蜂房,每次只能从蜂房的右侧行走,问一共有多少种方式。思路:每个蜂房内向右走有两个方向,右上、右下,对于不相邻的两个距离最近的蜂房,从中间相隔一排通过时,又是一个斐波那契数列,也就是f(n)=f(n-1)+f(n-2),而对于一个规则的蜂巢来说,从标号的1走到6跟从3走到8是没有差别的,可能的方式是中间间隔的蜂房数。感想:夹在好几个斐波那契数列之原创 2016-05-07 22:53:40 · 236 阅读 · 0 评论 -
Problem-P
概述:现在规定了平面内可以行走的方向,向左向右和向上,不能够向下,现在给出行走的步数,问在这个步数内最多有多少种方案。思路:一个类似与斐波那契数列的地推题目,不过与斐波那契数列不同的是,在选择向左或是向右走一步之后,下一步只能有两个方向,而在选择向上行走时,可以有三个方向,即向左上或是右上或者一直向上。也就是在相邻的某一步内,选择的方案成为两倍,即f(x)=2*f(x-1)+f(x-2)。原创 2016-05-08 10:39:48 · 222 阅读 · 0 评论 -
Problem-A
概述:给出一段序列,求在这段序列中能求出的最大和,并且表示出这个和是从那里开始到哪里结束。思路:最大序列和的问题。讲课时候讲过一道这样的题目,但是与那道题目不同的是,这道题要求把序列开始时数字的位置和结束时数字的位置写出,这个就要求在结束时选择的数字相等时就是结束的标志,然后倒着推回去,当数字相等时就是开始的位置。思路:上午上课做的这道题,最开始落掉了位置这个。。wa了,改掉之后又然后因为原创 2016-05-08 23:05:02 · 576 阅读 · 0 评论 -
动态规划算法总结
动态规划,是求解决策过程最优化的数学方法,是在处理问题过程中,把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解的一种方法,它没有一种确切的解题步骤,它的解决思路是多种多样的。 这套题里边遇到的dp问题主要有斐波那契数列、最长上升子序列问题、还有就是两种背包的问题。 斐波那契数列:f(n)=f(n-1)+f(n-2),这个就是著名的斐波那契数列,原创 2016-06-02 22:21:27 · 284 阅读 · 0 评论 -
Probl
概述:有0-10十个位置的点,起始点在5,现在每秒在任意位置掉馅饼,每秒人物可以移动一步,求最多能够收集多少馅饼。思路:dp的题目,设立一个数组用来储存某一秒掉到某点的馅饼,最后求最大值,满足就可以。感想:上午在机房做的题,然后因为编译器的原因,晚上才改了改题目,上交,提交两遍,wa,不清楚原因,然后把代码重新写了一遍,ce,掉了头文件。。。改完上交成功,这道题上交路程充满坎坷。。。#原创 2016-05-22 22:26:03 · 341 阅读 · 0 评论 -
Problem-H
概述:给出一块地图数据,需要从最左上角走到最右下角,每走一步所在的地方都有数据,求怎么走才有最大的数据。思路:DP的问题,需要考虑的是相加会出现负数。感想:自己做了一遍,最后自己在编译器上结果始终出不来,然后再别人博客看到才发现没有考虑负数的问题。。。然后按照那个思路再来一遍,过。#include #include#include#include#includeusing原创 2016-05-23 12:18:07 · 193 阅读 · 0 评论 -
Problem-J
概述:有个台阶,每次只能上一阶或者两阶,问要到某一台阶,共有多少种走法。思路:动态规划的问题,用斐波那契数列解题,每上一层台阶,从相邻的下台阶只有一种方式,但是上下台阶有不同方式,然后相隔的下台阶上这个台阶也有一种方式,同时上相隔的台阶有不同的方式,所以相加就是上这个台阶的方式,斐波那契数列。感想:下午写完的题目好像忘记写感想了。。这两道题目都是斐波那契数列的题目,推理找出规律就简单了,所原创 2016-05-07 21:21:51 · 191 阅读 · 0 评论 -
Problem-F
概述:现在有一个数塔,要从顶层走到底层,问走过的数的和最大是多少。思路:作为动态规划的题目,这个题在推理时明显是从最底层开始,走向最顶层,这样从最底层的某一个开始,想倒数第二层走,将每个最底层的数字加到倒数第二层,求最大的数字,然后再向上走,直到到顶层,就是所求的最大数。#include#include#includeusing namespace std;int max(int原创 2016-05-07 16:09:42 · 235 阅读 · 0 评论 -
Problem-L
概述:现在用多米诺骨牌去排2*n的矩形,骨牌是2*1的规格,现在问共有多少中排法。思路:当n=2时,有2种排法,当n=3时,有三种排法,而当n=4时,有5种排法,n=5时,有8种排法,从数字上看是一个斐波那契数列,可解。感想:靠数数字就可以数出来,推导出递推公式就能解题,但是提交一直ce,改了多次一直ce,检查无错,最后找人的代码改掉交上,个人感觉ce的原因可能是因为中文符号。#inc原创 2016-04-27 23:52:34 · 220 阅读 · 0 评论 -
Problem-W
概述:提交offer,每提交一份需要花一定的金额,然后有一定的几率拿到offer,现在一共有一定的金额,问在金额允许的情况下拿到offer的几率是多少。思路:dp中的01背包问题,推导状态转移方程:dp[j] = min(dp[j], dp[j - money[i]] * offer[i]);然后这道题跟别的比起来有意思的是不直接求所求数据,用1去减,然后结果在减,间接求。感想:提交第一遍原创 2016-05-24 09:49:30 · 216 阅读 · 0 评论 -
Problem-X
概述:现在有一些商品,手里有一些钱,然后每件商品都有自己的金额和价值,但是每一件商品购买都需要手中的金钱大于某个值,在这种情况下,求最大得到的商品的价值。思路:01背包问题,这道题跟别的不同在,所需的金币有了一个限定值,这样的话用一下排序,保证在当前状态下手中金币的值是最有可能大于商品的限定值的,然后就用状态转移方程像解一般的背包问题解决。状态转移方程:dp[j] = max(dp[j], d原创 2016-05-26 23:39:46 · 327 阅读 · 0 评论 -
Problem-B
概述:给出两个序列,求序列的公共最长序列。思路:用一个动态的数组储存相同的字符,每个字符之间比较,如果不用DP的话,用一个for循环嵌套应该也是可以做的,无非在结果处理上有些费事。感想:有例题的存在,这个题并不是太难,但是始终有一点不明白的是在测试数据中第二组programming contest,是怎么出现2的,也不知是否是我翻译错了。。。总共做出来了,虽然提交时候出现了Memory L原创 2016-05-16 20:44:19 · 215 阅读 · 0 评论 -
Problem-C
概述:给出一个数字序列,让从某一点开始行走,每走一步求和,走的每一步必须比上一步的数字大。思路:设置一个数组,每走一步,如果满足要求,将这个位置的数与之前的数相加,记录在数组里,最后数组求最大值,就是问题的解。感想:从测试数据中看出来是一个求最大和的问题,翻译没看开始写代码。。题目不难,但是提交时又忘记fstream,做错一次。。#include#include#include#原创 2016-05-16 21:05:52 · 244 阅读 · 0 评论 -
Problem-D
概述:输出总长度小于5842的数字,数字满足的规则是必须含有因子2,3,5,7。思路:发现了一个强大的算法,就是四个数字,分别对应四个数字,每次分别乘2,3,5,7.然后这些数字求最小值,然后最小值对应的数字加,再次相乘,不断循环,直到到达极限。感想:自己开始时候做了这个题,自己的思路是数字乘2,3,5,7,然后取恰当的值,忽然发现这样或许会有拉下的数字,然后用数组储存求出的数,分别对2,原创 2016-05-16 21:58:16 · 182 阅读 · 0 评论 -
Problem-R
概述:给一个储蓄罐,开始时候储蓄罐有自己的重量,并且能装的金币有最大限制,然后问在打破罐子可以拿钱买到东西时,最少需要存多少钱。思路:dp的完全背包问题,将01背包的求解方式倒序一遍就可以,求最小值,最后输出时减去开始时候的罐子重量。感想:交的有点晚了。。上午在机房做的一道题,不过在机房因为编译器不习惯,报错,没来得及交,然后刚刚写完一份表格之后改了改,在本地可以之后便上交了,最后发现是状原创 2016-05-30 00:06:59 · 259 阅读 · 0 评论 -
Problem-S
概述:给出一些金额和数量,求出如何分才能最接近a的值且不超出b的值。思路:求出给的金额的总和,然后平分,转换为一道01背包的题目。感想:这道题做了一个周了,但是思路不是我自己的,因为完全背包不熟,当时又恰巧发现了这个方法,将完全背包转换为01背包,很令人惊艳的思路,所以当时就把这道题按照人的思路做了出来,然后看了看别的完全背包,结果好像并不是通用的,但是这个可以的。#include#原创 2016-05-30 22:09:26 · 219 阅读 · 0 评论 -
Problem-Q
概述:主人公有个背包,用背包来装骨头,背包包括可以承装的骨头的体积,现在给出骨头的数目和每块骨头的体积以及价值,求在背包可以装下的情况下骨头的最大价值。思路:dp问题的01背包问题,主要在状态转移方程:dp[j] = max(dp[j], dp[j - cost[i]] + a[i]);把能撑装的情况下价值最大求出即可。感想:在做之前先去看了看背包九解。。发现有点多,所以只看了01背包,然原创 2016-05-23 21:27:36 · 182 阅读 · 0 评论