
动态规划
the_conquer_zzy
计算机科学与技术专业
展开
-
hdu 1011 starship troopers
这道题是一个树形 背包问题,或者说树形DP问题,房间的管道形成树。背包问题的特点: 最优子结构,可分解, 解决办法: 常见的有递归(自顶向下),搜索(自底向上),背包注意的问题,为什么要自底向上搜索????需要好好学习背包问题;#include <iostream>#include<vector>#include<cstdio>#include<cstring>using namespac原创 2017-06-09 17:01:53 · 259 阅读 · 0 评论 -
hdu 1160
这是一个最长上升子序列,只不过,不是简单的数字增加而已。LISLISfor(int i=0;i<n;i++){ for(int j=0;j<i;j++){ if(dp[i]>dp[j]&&dp[i]<dp[j]+1){ dp[i]=dp[j]+1; } }}此外还可以用另一种方式求最长上升子序列的长度。利用栈遍历整个数列如原创 2017-08-11 21:16:24 · 284 阅读 · 0 评论 -
hdu 1243
主题思想: 这是一个变形LCS,但是我却TLE了,代码和求LCS基本一样,只不过LCS是长度加1, 这里是加恐怖分子权重。TLE的根本原因是: 使用了memset,, memset对所有结果进行赋值,但是其实我们只需要初始化 dp[0][j] (j 取 1,–列的长度) 和 dp[i][0] (i 取 1,,行数) dp[0][0] m+n+1 个 而memset,是对m*原创 2017-09-07 15:09:50 · 352 阅读 · 0 评论 -
hdu 1244
主题思想: 动态规划dp[i][j] 表示前i个段,由前j个数组成。 那么对于第j个数,可以入选,前i段,也可以不入选 如果j组成了第i段,那么j-len[i] 组成i-1 段dp[i][j]=max(dp[i][j-1],dp[i-1][j-len[i]]+sum[j]-sum[j-len[i]]AC 代码:#include <iostream>#include<cstdio>#inc原创 2017-09-07 21:19:04 · 387 阅读 · 0 评论 -
hdu 1227 Fast Food
主题思想: 动态规划首先 对于一组升序的数,选择仓库在中位数的位置能是距离最短,这种思路以前遇到过。动态规划转移方程 : 就是这个不好想啊。 首先题目要求的是距离。 那么就用dp表示距离,因为好多题都是这样。 另外dp[i][j] 是一般动态规划的形式,且一般下标从1 开始,那么我们这里要想明白dp[i][j] 表示什么意思。 令dp[i][j] 表示前j个商店中有i个仓库时,距离的和原创 2017-08-31 22:41:47 · 232 阅读 · 0 评论 -
hdu 1260 Tickets
主题思想: 动态规划。这题第一开始想到dp,后来又觉得不是dp,构建了图,按最短路径求,可是TLE, 还是觉得是dp, 这次想通了,dp其实是递归的形式,每次保存结果,避免递归的重复计算,就是dp。 如果要想找到dp,这要从第2个人开始分析,第一个人是一个特例。 核心状态转移方程。 dist[i]=min(dist[i-2]+d[i-2],dist[i-1]+a[i]) ,i=2,3,4,.原创 2017-09-19 09:11:00 · 360 阅读 · 0 评论 -
hdu 1284 钱币兑换
主题思想 : 这题有两种主流思路: 母函数方法,和动态规划方法。先说母函数方法,母函数方法,模拟多项式乘法,这里,有个技巧就是,利用数组下标表示多项式指数。 模拟 (1+x+x^2+x^3+x^4+…)(1+x^2+x^4+x^6+…)(1+x^3+x^6+x^9+…) 由于是n是有限制的,所以开辟n+1大小的数组,模拟乘法。int a[maxn]; int b[maxn]; f原创 2017-09-27 13:48:15 · 263 阅读 · 0 评论 -
hdu 1231
主题思想:最大连续子序列,最大连续子序列是和最大的连续子序列, 这是一个经典的dp问题。 dp[i] 表示以i结尾的连续子序列的和 对于第i个数字,或者选择加入前面的序列,此时dp[i]=dp[i-1]+a[i],或者本身作为一个单独的序列,此时dp[i]=a[i]。dp[i]=max(a[i],dp[i-1]+a[i])即,如果dp[i-1]+a[i]>a[i] 则选择a[i]加入以前的序列原创 2017-09-02 15:58:10 · 345 阅读 · 0 评论 -
hdu 1171 背包
多重背包我擦,TLE ,N次,最后是因为自己读题忽略一个条件,遇见负数就终止结果自己根据用例,判断成遇见-1了,雪崩。!!总结一下,如果TLE 原因可能如下: 1,程序确实超时, 2. 程序结束条件不对,检查跳出循环的条件。 套用模板 while(scanf(“%d”)!=EOF){ if(n<0) break;}01背包for(int i=1;i<=n;i++) for(int v=V原创 2017-08-15 23:11:47 · 237 阅读 · 0 评论 -
hdu 1292 下沙ACM夏令营
主题思想: 动态规划。可以理解为i个人分为j组,另dp[i][j] 表示i个人,分成j组, 那么i个人,可以由i-1个人组成j-1组,第i个人独立成组,也可以i-1个人组成j组,第i个人加到j组中的一个。 则状态转移方程:dp[i][j]=dp[i-1][j-1]+dp[i-1][j]*jAC代码:include includeincludeusing namespace std;const in原创 2017-09-28 11:49:30 · 294 阅读 · 0 评论 -
let 97 Interleaving String
Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.For example,Given:s1 = "aabcc",s2 = "dbbca",When s3 = "aadbbcbcac", return true.When s3 = "aadbbbaccc", return fals原创 2018-01-22 21:52:23 · 416 阅读 · 0 评论 -
hdu 1203
经典动态规划 : 是一个背包问题。 如何选择使机会最大。 这是一个经典问题。 需要在重头考虑一下。 01背包 完全背包等思考过程。原创 2017-08-23 21:39:05 · 286 阅读 · 0 评论 -
hdu 1159
主题思想: 最长公共子序列 LCS此題是经典dp题之一。 1AC,,主要还是要自己考虑下。 对于字符串a,b dp[i][j] 表示以字符串a中第i个字符,和b中第j个字符结尾,最长公共子序列的长度。 初始化dp为全0.if(a[i]==b[j]) then dp[i][j]=dp[i-1][j-1]+1else dp[i][j]=max(原创 2017-08-11 17:58:00 · 249 阅读 · 0 评论 -
hdu 1025 最长子序列,lower_bound的使用,二分查找
这道题,我想的是dfs,毕竟我刚学会这个算法,后来,也想到要排序,那是我为了寻找剪枝条件,最后,找到这种解法,mark一下。 学到一个最长上升子序列的求解方法:利用二分查找。原创 2017-06-12 23:59:52 · 338 阅读 · 0 评论 -
hdu 1114 Pig-bank
完全背包问题。 问题错在memset的使用上,const int INF=100000;memset(dp,INF,sizeof(dp));并不能把数组dp全部赋值为INFmemset是按字节复制,所以,一般可以进行数组的赋0 操作,否则不要使用memset进行赋值,而是老实的使用循环。完全背包核心代码: for(int i=0;i<N;i++){ for(int j=w[i];j<原创 2017-07-30 23:05:34 · 290 阅读 · 0 评论 -
hdu 1074 doing homework
状态压缩dp 首先进行状态映射,(状态压缩),一共有15门课,每门课则可用一个数字位 来表示这门课作业是否已经做完,比如3门课 001,表示完成了第一门课作业,101,表示完成了第1门,第 3门作业。 则需要一个0-15位整数范围的数来表示所有状态 初始状态000, 结束状态1111…11 表示完成了所有作业。 再找状态转移方程 对于状态i, 这个状态可能由前一个状态pre,加上做完一道作原创 2017-07-23 15:40:15 · 278 阅读 · 0 评论 -
hdu 1069 monkey and banana
此题是动态dp,也可以是最长单调子序列的变形。一个类型的箱子,可以变为3个不同的箱子,共有n*3个箱子,对箱子先按长排序,再按宽排序 思路:对于3*n个箱子 ,i表示第i个, dp[i] 表示,以i作为最底层箱子时的最大高度则 dp[i]=max(dp[i],dp[i]+dp[j]) dp[j] 是所有小于箱子i的高度,求出其中最大的高度。最后 ,在i个箱子对应的高度dp[i] 中选原创 2017-07-18 17:37:39 · 237 阅读 · 0 评论 -
关于dp小结(一)
这篇博客主要弄懂以下几个常见的问题:主要是dp思想 并学会后缀数组的使用,以及最长公共子序列在空间上的优化。一,最长公共子序列问题:二, 最长子串三, 最长上升子序列四, 最大子序列和 五, 最大子矩阵和原创 2017-07-24 16:16:37 · 183 阅读 · 0 评论 -
hdu 1080 Human Genne Function
这道题我不会。dp感觉老是自己写不出来啊,状态转移方程不好建啊,问题抽象。 我一定可以超越其他人,其他人混得比我好,只是因为他们比我早几年工作吧。沉下心来学习,不要被世俗所打扰,守护你的高傲。 用的是dp的思想。 和求最长LCS的思路大体相似。 对于一个序列s1,s2. 用数组dp[i][j] 表示 s1 的第i个字符和s2的第j个字符 比较时最大值 ,,这时分3种情况: s1[i]原创 2017-07-24 18:47:11 · 273 阅读 · 0 评论 -
hdu 1081 To The MAX
这道题是求最大子矩阵和。 在说最大子矩阵和前,先说另一个问题最大子序列和 关于最大子序列和的问题:有一个证明: 那就是: 和最大的子序列 ,ai1,ai2,….aj。 i<=j 其开头元素必定不小于0 , 可以通过反证法,如果开头元素(第一个)小于0 ,那么把这个元素去掉的子序列的和必定大于原来序列的和,和原先序列和最大相悖。故得证。根据以上证明,可以求最大子序列。sum= dp[k]原创 2017-07-24 20:24:29 · 247 阅读 · 0 评论 -
hdu 1176
动态规划状态转移方程: 有三种状态,可以保持不动 ,也可以在下一秒时间走一步:向左,向右,特殊的 如果走到两端,则减少了一种情况。 由于申请的数组大。 走到最右端,再走,默认值是0, 所以可以一并处理。但是走到最左端,如果再向左走,下标变成-1 ,会出界。状态转移方程: dp[x][t] 表示t时间在x位置if(x==0) dp[x][t]+=max(dp[x+1][t+1],dp[x][t+原创 2017-08-16 22:26:27 · 214 阅读 · 0 评论 -
hdu 1087
纪念下: 这道题是简单dp,是一道自己可以看出来并实现的dp,证明之前的学习还是有用的继续加油状态选择方程: dp[i]=max(dp[j]+a[i],dp[i]) { j is a[j]#include <iostream>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;#define原创 2017-07-26 13:23:20 · 189 阅读 · 0 评论 -
hdu 1158 Employment planning
这题有两种解题思路 1.dfs 但是由于dfs可能很多状态会重复搜索,所以需要记忆化搜索。记忆化搜索的典型方式是: dfs +dp 另dp[i][sum] 表示 第i个月时有sum个人时,剩余月份所需开销最小。 则dp[0][0] 即为最后结果。 对于第i 个月 刚开始有sum 个人,sum如果小于等于,则需要新招聘人员,那么dp[i][sum]=dp[i+1][person[i原创 2017-08-11 15:20:34 · 240 阅读 · 0 评论 -
let 72 Edit Distance
Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)You have the following 3 operations permitted on a word:原创 2018-01-15 22:33:31 · 136 阅读 · 0 评论