动态规划
摆渡过江
球可以不打,游戏可以不打,然题不能不刷
展开
-
洛谷P2607 骑士 树形dp
思路:首先我们想到可以对相互憎恶的俩个骑士连边,这样就得到了一个图,有多个连通块,并且每个连通块中最多只有一个环。如果每个连通块都是一颗树,那么这个问题就很简单~每个节点都是选或者不选。idea1:我想可不可以把这个比树多一条边的图,变成一棵树来处理,那么就是要删掉环上的一条边。考虑删掉这条边(u,v)的影响是什么,影响是u,v两点可能同时被选,产生错误的答案。我的解决办法是把边删了的同时...原创 2020-03-13 18:22:53 · 182 阅读 · 0 评论 -
uva10003(有点迷糊的思考)
思路:这题跟矩阵链乘的思路一样,所以还是很好考虑的,只是有一点需要加两个切割点;代码如下:/*求最优的切割顺序最优子结构:dp[i][j]从i刀到j刀的最优切割顺序子问题:哪一刀最后切,dp[i][k]+dp[k][j]|i<k<j证明:因为最后一刀切的所有情况都被历遍到了,必定包含了最优解*/#include<cstdio>#include<...原创 2018-12-19 19:35:59 · 198 阅读 · 0 评论 -
uva12563(对于状态的理解)
思路:这题有两种状态都可以,具体的在代码中有写代码如下:/*其实这题的意思就是求在t时间内,选尽量多的歌曲最优子结构:在j时刻,能从i首歌中选择的最多歌曲数(注意这里是j时刻,不是<=j时刻)(因为是j时刻,所以答案,要判断每个时刻的能选择的最多歌曲数)证明:子问题是在j时刻从i-1首歌中选最多的歌曲数+【选这首歌(dp[i-1][j-num[i]]+1),或者不选这首歌(...原创 2018-12-14 14:01:10 · 357 阅读 · 0 评论 -
poj3666(dp逻辑的重要性)
思路:不知道为啥中间有一段时间没搞清楚状态时怎么转移的,想了好久,不过最后还是想明白了。在想状态转移的时候一定要牢牢抓住状态,通过状态来思考如何转移;第一次提交得到了完美的TLE,因为复杂度是n^3(其实当时也想到了,不过抱着侥幸的心理提交了);上网查了查题解,别的都是一样的,就在判断最小dp值时,每次都历遍造成了重复计算,优化一下,每次都记录最小值minn,那么后面一个直接跟minn比,就得到了...原创 2018-12-20 17:14:30 · 570 阅读 · 1 评论 -
uva11400(对dp的进一步思考)
思路:这次比之前想到的会多一些,不过还不够,具体过程在代码中代码如下:/*条件:高v的灯可以替换低v的灯 思路1:dp[i]表示(1->i)号灯泡经过替换后得到的mincost,dp[i+1]为min(i替换成i+1...i+n)+dp[i];错误! 因为该子结构不具有子问题独立性:之前的灯泡替换成之后的灯泡,那么对之后的灯泡能否替换就将产生影响思路2:(对上面的思路进行限...原创 2018-12-15 17:26:22 · 310 阅读 · 0 评论 -
uva 437(不用记忆化搜索解)
思路:放代码上了代码如下:/*最优解是max height最优子结构是以i方块作为最后一块的最大长度子问题的最优解是以前1,2,3...i-1个方块作为最后一块的最大长度显然:最优子结构包含了子问题的最优解 并且这些子问题的解之间相互独立(其中一个问题的解,不会影响另外一个)重叠子问题:每次都不用再计算子问题的解,因为这些解都已经保存在了表中 综上:用dp[i]保存以...原创 2018-12-10 17:04:33 · 226 阅读 · 2 评论 -
牛客练习赛35 B(简单dp,ORZ)
思路:想明白了发现真的简单dp。。。我还是太菜了代码如下:/*果不其然。简单dp...是我菜,不是题目难做这题首先我没想到dp(哭晕)看了题解半天。一脸懵逼既然dp解那么先考虑最优解的结构特征先想只用一维表示,dp[i]:在i这个位置上得到的最多的方案数上面是不行的,因为dp[i]没有记录i位置上是什么元素,导致下一步无法转移(条件中说了,不能有超过连续A个元音,只用dp[i...原创 2018-12-30 16:45:30 · 166 阅读 · 0 评论 -
牛客训练赛36 B题(dp滚动数组)
2019年第一次比赛,遭逢大败。。。都不忍心看自己的排名,第一题一直在想该怎么去优化。发现并不用,直接暴力过。。。心态炸了,第二题是dp题,一开始想到了增加维度以获得更多信息,还好死不死的用疲劳度作为第二维。。。结果数组变成400*81000那么大。。。一直在推状态转移方程还推不出来。。。看了题解恍然大悟。。。哎,在推不出状态转移方程的时候应该改变思路,想办法减小每一维的大小,这样就比较容易想到正...原创 2019-01-05 14:19:13 · 228 阅读 · 1 评论 -
矿大G毕业生的礼物(贪心)
思路:离散化,之后贪心选取最多的三个种类的物品(注意每次要一个个选,因为要保证每个阶段的选择都是最优的,如果一下子拿,就可能导致某个阶段的选择不是最有选择);例:161 1 2 2 3 3 4 4 4 4 5 5 5 5 6 6ans=5;代码如下:/**/#define LOCAL#include<cstdio>#include<algorit...原创 2019-07-06 17:37:15 · 312 阅读 · 0 评论 -
牛客练习49D(差分巧解区间+递归的处理)
思路:看到这题,我脑海中浮现了一颗树~每个叶子都是一个1类型的操作。。。想到了n^2的算法,记录下每个操作时,之前所有操作的操作次数。dp[i][j]:i操作时,j操作一共运行了多少次~然而并没有什么用。。。看到题解发现真厉害%%%;用后缀差分(tg[i])记录下第i次操作和第i+1次操作的操作数之差,每次遇到2的操作时,令tg[l-1]减去当前操作数(其实很好算当前操作数,都是当前次数+tg...原创 2019-07-07 10:40:00 · 217 阅读 · 0 评论 -
uva 1625(dp)
代码如下:/*最优子结构:dp[i][j](1...i,1...j)合并后的minsum子问题:dp[i][j-1],dp[i-1,j](合并最后一个字符是来自哪个字符串)证明:最优解的最后一个元素必定来自两个字符串的末尾,如果子问题不包含最优解,那么说明dp[i][j-1],dp[i-1][j]不是最优解(矛盾)具体实现:滚动数组记录dp[i][j],并且记录这个状态下每个字符的最...原创 2018-12-19 13:34:24 · 155 阅读 · 0 评论 -
hdu1074(状压dp)
思路:先说什么是状压dp(一开始我也不知道,但是做了一次之后发现还挺简单的),一句话概括就是一种很暴力的dp方式;核心思想是:枚举所有的情况,用二进制记录状态这道题其实只要枚举所有状态,并且是根据前面的状态推导得到,如:用(111)表示三门课都完成,则这个状态有可能是从(110),(101),(011)这三种状态推出;代码如下:#include<cstdio>...原创 2018-12-03 18:58:06 · 320 阅读 · 0 评论 -
hdoj 2955 robberies(01背包)
思路:一开始想到了要用01背包做,但是发现逃跑概率是实数。。。说明这个思路行不通(别跟我说扩大到整数。。。这题的实数精度太高行不通的)果断转换思路(上网百度),把获得的金额看成背包容积,逃脱率(注意是逃脱率,不是被抓率,概率应该是(1-被抓率),并且是相乘)看成物品,问题就转化成了,在逃脱率范围内,最大获得的金额是多少;代码如下:#include <iostream>#in...原创 2018-07-29 09:40:23 · 135 阅读 · 0 评论 -
hdoj 1003 Max Sum(动态规划——入门最大子序列)
思路:这题看到100000个数据,想暴力破解就基本是不可能的了(暴力时间复杂度是n^2)换思路,在加上一个数据之后有以下情况:1.变成负子序列,直接舍去(原因是如果是负子序列之后的任何数据加上它都会变小)2.变成正子序列,跟之前最大的子序列的和比较 2.1如果小于不用管 2.2如果大于更新最大和,并记录下下标这个思路的时间复杂度是n;代码如下:#include<stdio.h&g...原创 2018-07-15 15:41:54 · 369 阅读 · 0 评论 -
zcmu 1919 kirito's 星爆气流斩(多重背包转01背包,并且进行2进制优化)
思路:明显的背包问题,并且是多重背包,多重背包有两种思路 思路1:当成一种新情况考虑,因为有个数的限制所以跟完全背包不一样的地方在于状态转移方程应该是dp[i]=max{dp[i],dp[i-k*w[i]+k*v[i]}(k:0->j/w[i]),但是这个会超时,因为时间复杂度是n*w*j/[w[i]];附上一段超时的代码:#include"stdio.h"#...原创 2018-07-22 12:49:47 · 237 阅读 · 0 评论 -
zcmu 2165 黄金矿工(分组背包)
分组背包:分组背包,由基础背包演化而来的一种情况。具体问题是这样的。具体问题是这样的。一个容量为V的背包,还有若干组物品,每组包含若干物品,这些物品各不相同,而且体积w和价值p各不相同。组内的物品相冲突。求出能在不超过V的情况下尽可能的使价值最大。乍一看好像很难的样子,其实仔细想想很简单,这种问题完全可以用01背包解决。 对于分组背包,可以这样想:虽然分成很多组,但只能选一个,或者不选,这...原创 2018-08-01 15:31:30 · 216 阅读 · 0 评论 -
zcmu 2112 聪明的美食家(最长上升子序列nlogn做法)
思路:最长上升子序列(LIS)的典型变形,熟悉的n^2的动归会超时。LIS问题可以优化为nlogn的算法。定义d[k]:长度为k的上升子序列的最末元素,若有多个长度为k的上升子序列,则记录最小的那个最末元素。注意d中元素是单调递增的,下面要用到这个性质。首先len = 1,d[1] = a[1],然后对a[i]:若a[i]>d[len],那么len++,d[len] = a[i];...原创 2018-08-01 16:16:05 · 171 阅读 · 0 评论 -
hdu 2159 FATE(二维完全背包)
思路:观察题目,有两个约束条件,要在耐心的范围内,而且不能超过杀怪数;所以简单的一维背包问题解决不了。要用二维的完全背包来做;二维完全背包就是在有两个代价c1,c2的时候,求在这种状态下的最大收益;类比一维的完全背包:dp[j]=max(dp[j],dp[j-w[i]]+v[i]);j正序历遍二维的完全背包,只是多了一个维度:dp[j][k]=max(dp[j][k],dp[j-c1[...原创 2018-09-11 15:56:20 · 141 阅读 · 0 评论 -
hzau Little Red Riding Hood (入门级dp)
思路:很明显的dp,dp[i]代表在i鲜花处得到的最大值,那么久两种情况,i鲜花拿,i鲜花不拿拿:dp[i]=dp[i-k-1]+a[i] 因为如果拿了,那么前k朵都凋谢了,也就是要前第k+1朵才能采;不拿:dp[i]=dp[i-1] 不拿值跟前一个朵的值一样所以dp的动态转移方程就是dp[i]=max(dp[i-k-1]+a[i],dp[i-1]);代码如下:...原创 2018-09-18 11:16:53 · 194 阅读 · 0 评论 -
hdu 1087 Super Jumping!(dp)
思路:动态规划的三个原则是:1.子问题重叠性2.无后效性3.子结构最优性如果这题把dp[i]当成前i个数的最长上升子序列的话,那第i+1个数会影响前i个数的选择,比如 5 6 1 2 3;第i+1个数加上去不一定使得和前i个数加起来就是最长子序列所以正确选择子问题的方法是:dp[i]代表以第i个元素结尾的最大上升子序列;代码如下:#include <iostream>...原创 2018-09-20 12:28:22 · 85 阅读 · 0 评论 -
zcmu 1400 给报销吗?(dp-01背包)
思路如下:只要求出所有可行的支票,能凑出的最多的报销额度,并且不大于最大额度;(坑点就是支票上单项不超600,不是每个都不超过600,难点是动态转移方程dp[j]=max(dp[j],dp[j-val[i]]+val[i]));ac代码如下:#include <bits/stdc++.h>using namespace std;int dp[5000010];int v...原创 2018-07-25 20:31:52 · 143 阅读 · 0 评论