动态规划
番茄你个西红柿i
咸鱼一条.
展开
-
DP一周做题报告1
好久没有更新博客啦,今天终于有时间来机房**啦! 上周我刷了不少DP题目,深有感触,所以今天特地来写一些总结。 直接题目! 例题一——导弹拦截 这道题目很经典,题目有两个问题,第二问是贪心问题,所以我们在这里只讨论第一问。 因为后面的导弹的高度一定小于等于前面的导弹的高度,所以最终拦截的导弹的高度是构成了一个不下上升序列,因为长度要最长,所以求的是一个最长不上升子序列。 我们可以设...原创 2018-03-10 20:36:19 · 150 阅读 · 0 评论 -
4月12号真诚的dp练习赛
啊啊! 犬国VAN岁! T1 这题是一个基础DP。 我们设计Fij,i表示前i首歌,j表示音量,如果Fij等于1,说明存在这个状态。 那么代码就很简单了呀:#include<bits/stdc++.h>using namespace std;int n,bl,ml;int a[55];int f[55][1111];bool flag=0;int ...原创 2018-04-12 19:35:55 · 189 阅读 · 4 评论 -
虚伪的DP练习赛!
T1 这题和数字三角形差不多。 你可以建立一张图,行代表时间,从1开始;列代表位置,从1到10. 首先你用一个a数组存那些时间点会有馅饼落下来。 然后用f数组做DP,Fi j 的最优值是由他上方,左上方,右上方,三个位置的最优值取max,再加上他本身位置上会落下的馅饼数量。 ——————————————————————————分割线 T2 这题和爬楼梯相似。 我们直接用D...原创 2018-04-08 13:26:05 · 142 阅读 · 3 评论 -
动态规划不经典问题之LCS与LIS的终极合体——LCIS!
每天都要水博客!。 其实我应该写区间DP和树形DP的,但是还剩30分钟下课,我怕写不出什么好文章,那就随便说点吧。 LCS(最长公共自序列)和LIS(最长上升自序列)都是我们很熟悉的问题,那么我们该怎么求一个最长公共上升自序列呢? 其实我们思考一下这两者的算法,也大约有了点思路。 对于第序列一的第i个和序列二的第j个,如果他们相等,那就往前搜,因为不下降,所以前面能够继承的值一定要满足比第...原创 2018-03-20 21:29:41 · 195 阅读 · 0 评论 -
关于LC(01)背包的一些小问题。
日常水博客! 01背包在取得最优值时不一定将背包装满,所以们思考如何在装满背包的情况下取得最优值。 看似是一个不一样的问题,其实解决方法很简单,只要更改初值就可以了。 01背包(不要求装满):for(int i=1;i<=v;i++)f[i]=0;要求装满: memset(f,-127,sizeof(f)); f[0]=0;OK了。 这样保证在状态转移时...原创 2018-03-19 21:06:04 · 319 阅读 · 0 评论 -
背包问题之分组背包!
我又来水博客了。 分组背包是LC(01)背包的一种变形。分组背包中物品被分成几组,每组中只能挑选出一件物品加入背包,这是与01背包的区别。 在01背包中,我们以每一件物品作为动态规划的每一阶段,但是在分组背包中我们要以每一组作为每一阶段。 其实很简单,代码如下。for(int i=1;i<=k;i++)for(int c=v;c>=0;c--)for( each 物...原创 2018-03-18 21:20:46 · 3850 阅读 · 2 评论 -
LCS问题的深入探讨
在上一篇博客中我简单的说明了LCS的算法原理和DP方程,但这是远远不够的,我们还要考虑如何实现。 观察这个DP方程,我们感觉它的结构类似于树,就像这样: 我们可以用搜索的方法来求解,但是会有许多重复。 就像上图中(6 4)被搜了两遍,也许后面还会搜到。 大量的重复会导致效率的降低,所以我们要设计一种解决方法。 这种解决方法叫做备忘法,其实很简单,就好像你做了一个备忘录,每次搜索时都查...原创 2018-02-25 14:17:45 · 178 阅读 · 0 评论 -
动态规划经典问题之LCS
LCS是最大公共子序列的缩写。假设有两个序列x和y,有一个序列z即是x的子序列,又是y的子序列,就称z为xy的公共子序列。最长公共子序列就是长度最长的公共子序列。(如果还不明白可以百度)。 如何求最大公共子序列呢? 我们首先想到的可能是枚举法,这也是最暴力最直接的方法,当然时间复杂度也是非常高的。 所以我们要用到高效的动态规划算法。 一般来说动态规划研究的是前i个元素的最优值,但这里有两条...原创 2018-02-24 16:37:07 · 307 阅读 · 0 评论 -
水博客之LC背包
讲一下背包问题里最简单的LC背包。 有n种物品,每种物品只有一件,每种物品都有他的价值和体积,你有一个体积为v的背包,要在装得下的前提下装价值最多的东西,请你求出这个最大的价值。 f[i][v]表示前i个物品放进体积为v的背包里的最优值。 对于第i件物品要么被放进背包,要么放。 如果不放,前i件物品放进v的背包的最优值就等于前i-1件物品放进v的背包里的最优值。 如果放,前i件物品放进v...原创 2018-03-10 21:35:11 · 220 阅读 · 0 评论 -
DP一周做题报告3(未完成并且懒得完成)
哇咔咔! 例题一——护卫队 这道题有时间啊,速度啊,挺烦的。所以我们输入的时候就把每辆车的过桥时间算出来比较方便哦。 这题看上去要开二维,其实一维就足够了。 对于第i辆车,我们枚举小于i的所有车j,这里枚举到j的意义是i到j的车是一组的,所以这里肯定是倒着搜索的(j从i到0),同时要把搜到的车的质量都累加起来判断有没有超上限。 我们在找出i到j的时间最大值作为他们过桥的时间,前j-1...原创 2018-03-10 21:16:21 · 139 阅读 · 0 评论 -
DP一周做题报告2
前一篇里的题目过于水,我在讲点别的题目(其实也很*) 我发现我上片博客讲的太鸡儿罗嗦了,这片我简单点,都是文化人嘛。 例题一——FJ收苹果 额,这道题目也很好做。 首先按照时间排序。对于第i个苹果,枚举时间在他前面的所有苹果,计算一下距离,如果可以从那个苹果走过来接这个苹果,那fi就可以继承fj的最优值。ojbk! 例题二——饥饿的奶牛 这道题目好像和轮船问题差不多,只是算...原创 2018-03-10 20:53:03 · 166 阅读 · 0 评论 -
状压DP例题(种花小游戏+广场铺砖)
状态压缩其实就是用特殊的方法来表示复杂的状态做DP,这种特殊的方法一般是位运算。 例题一:种花小游戏 DPi j ,i可以拆分成二进制数,每一位上的0或1表示是否走过,j表示当前位置。#include<bits/stdc++.h>using namespace std;const double maxn=200000000.0;double f[600010][30]...原创 2018-05-14 21:15:57 · 649 阅读 · 2 评论