随笔分类 -  动态规划

摘要:输出背包中选中的物品 方法一,用path[i][j] 到第i个物品体积为j时的状态是否由放入第i个物品转换而来 1 #include<iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 int dp[ 阅读全文
posted @ 2019-09-07 13:53 demianzhang 阅读(389) 评论(0) 推荐(0)
摘要:1. 动态规划的适用场景 动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。 2. 动态规划的基本思想 动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解。通常许多子问题非常相似, 阅读全文
posted @ 2019-07-28 22:51 demianzhang 阅读(546) 评论(0) 推荐(0)
摘要:dp HDU - 1257 最少拦截系统 最长递增子序列 HDU - 1029 Ignatius and the Princess IV HDU - 1069 Monkey and Banana POJ - 1458 Common Subsequence 最长公共子序列 dp[i][j] = 0 i 阅读全文
posted @ 2019-01-27 13:28 demianzhang 阅读(361) 评论(0) 推荐(0)
摘要:I 找一个连续最大子数组,sum加到nums[i], 如果前面子数组和<0则舍去,从头开始。 II 找两个不重叠的子数组,使得他们的和最大。 思路:一般有了I,II是变形版本,想办法往I上套,因为小规模的I已经做出来了,要好好利用他。 枚举划分的位置,将数组划分为左右两部分,每一部分调用I的函数就行 阅读全文
posted @ 2018-09-11 00:36 demianzhang 阅读(1452) 评论(0) 推荐(0)
摘要:1. Best Time to Buy and Sell Stock 2. Best Time to Buy and Sell Stock II 3. Best Time to Buy and Sell Stock III 4. Best Time to Buy and Sell Stock IV 阅读全文
posted @ 2018-08-07 17:32 demianzhang 阅读(396) 评论(0) 推荐(0)
摘要:题意:有n门功课需要完成,每一门功课都有时间期限以及你完成所需要的时间,如果完成的时间超出时间期限多少单位,就会被减多少学分,问以怎样的功课完成顺序,会使减掉的学分最少,有多个解时,输出功课名字典序最小的一个。 作业最多只有15个,容易想到是状态压缩 dp[i]表示i对应状态的最小扣分 i转换为二进 阅读全文
posted @ 2018-05-14 18:01 demianzhang 阅读(352) 评论(0) 推荐(0)
摘要:题意:一辆汽车在一张无向图中开告诉你每个城市加油的费用。每次给q个查询(起点,终点,油箱容量)问你最小花费是多少。 思路:一道Dijkstra状态的题目。在这种最短路问题中一维的dis数组记录的信息往往不能很好的解决问题,所以我们要给dis数组增加维数来使每个状态唯一。这其实就是结合了动态规划的思想 阅读全文
posted @ 2018-05-13 22:15 demianzhang 阅读(277) 评论(0) 推荐(0)
摘要:题意:给你N(N<=100)只牛,每只牛有一个智慧值Si和一个活泼值Fi,现在要从中找出一些来,使得这些牛智慧值总和S与活泼值总和F之和最大,且F和S均为正。Si和Fi范围在-1000到1000之间。 思路: 可以把S当体积,F当价值做01背包。但是注意是S可为负,所以整体加100000,然后要注意 阅读全文
posted @ 2017-08-16 14:36 demianzhang 阅读(533) 评论(0) 推荐(0)
摘要:题意: 有一头牛想要建一座石塔,他有很多不同类型的石块。每类石块有三个属性:1. (h): 石块的高度;2. (a): 石块能达到的最大高度;3. (c): 石块的数量 思路: 采用多重背包。注意点:在做背包前需要对石块能到达的最大高度(a)进行排序,防止石塔到了一定高度后,剩下的一些石块所能达到的 阅读全文
posted @ 2017-08-16 13:48 demianzhang 阅读(295) 评论(0) 推荐(0)
摘要:题意:农夫约翰想修一条尽量平缓的路,路的每一段海拔是A_i,修理后是B_i,花费|A_i – B_i|,求最小花费。 思路:平缓的意思是海拔单调增或单调减(非严格),主要目的大概是让我们做出“到底是增好还是减好”选择。 用DP的话可以完全忽略这个选择: dp[i][j] := 前i + 1个数变成单 阅读全文
posted @ 2017-08-16 13:01 demianzhang 阅读(465) 评论(0) 推荐(0)
摘要:题意:给你一个长为n(n<=40000)的整数序列, 要你求出该序列的最长上升子序列LIS. 思路:要求(nlogn)解法 令g[i]==x表示当前遍历到的长度为i的所有最长上升子序列中的最小序列末尾值为x.(如果到目前为止, 根本不存在长i的上升序列, 那么x==INF无穷大) 假设当前遍历到了第 阅读全文
posted @ 2017-08-16 11:26 demianzhang 阅读(263) 评论(0) 推荐(0)
摘要:题意: 给出两个数,n,m,问m以内的整数有多少种组成n的方法完全背包+大数划分 思路: dp[i][j] := 用i种价格配出金额j的方案数。 那么dp[i][0] = 1,使用任何价格配出金额0的方案个数都是1(什么都不用)。 递推关系式: 实际上是完全背包问题,只是状态转移方程形式有所不同,不 阅读全文
posted @ 2017-08-15 23:25 demianzhang 阅读(480) 评论(0) 推荐(0)
摘要:题意:给出T种数字。每种各有N[i]个。然后用这些数字构成一些序列, 问x长度到y长度的序列有多少种 思路: dp[i][j] 表示前i种数字构成长度为j的序列有多少种。 dp[i][j] = sigma(dp[i - 1][j - k]) k的范围是0~N[i] //前i-1个家族配成j-k的集合 阅读全文
posted @ 2017-08-15 20:13 demianzhang 阅读(309) 评论(0) 推荐(0)
摘要:题意:有n种面额的硬币。面额、个数分别为A_i、C_i,求最多能搭配出几种不超过m的金额? 思路:dp[j]就是总数为j的价值是否已经有了这种方法,如果现在没有,那么我们就一个个硬币去尝试直到有,这种价值方法有了的话,那么就是总方法数加1。多重背包可行性问题 传统多重背包三重循环会超时,因为只考虑是 阅读全文
posted @ 2017-08-14 00:42 demianzhang 阅读(551) 评论(0) 推荐(0)
摘要:题意:奶牛Bessie在0~N时间段产奶。农夫约翰有M个时间段可以挤奶,时间段f,t内Bessie能挤到的牛奶量e。奶牛产奶后需要休息R小时才能继续下一次产奶,求Bessie最大的挤奶量。思路:一定是对时间段dp,然后就是两个for的事了。只要前面能满足条件的状态就可以转移过来,然后取最大,不过要先 阅读全文
posted @ 2017-08-07 13:16 demianzhang 阅读(394) 评论(0) 推荐(0)
摘要:题意:2棵苹果树在T分钟内每分钟随机由某一棵苹果树掉下一个苹果,奶牛站在树#1下等着吃苹果,它最多愿意移动W次,问它最多能吃到几个苹果。思路:不妨按时间来思考,一给定时刻i,转移次数已知为j, 则它只能由两个状态转移而来。即上一时刻同一棵树或上一时刻不同的树 dp[i][j] = max(dp[i- 阅读全文
posted @ 2017-08-07 13:12 demianzhang 阅读(308) 评论(0) 推荐(0)
摘要:题意:把n拆分为2的幂相加的形式,问有多少种拆分方法。 分析:dp,任何dp一定要注意各个状态来源不能有重复情况。根据奇偶分两种情况,如果n是奇数则与n-1的情况相同。如果n是偶数则还可以分为两种情况,有1和没有1。这样分可以保证两种情况没有重复,对于有1的情况可以直接拆出两个1(拆一个也行,但变成 阅读全文
posted @ 2017-08-07 13:09 demianzhang 阅读(251) 评论(0) 推荐(0)
摘要:题意:对一个字符串进行插入删除等操作使其变成一个回文串,但是对于每个字符的操作消耗是不同的。求最小消耗。 思路: 我们定义dp [ i ] [ j ] 为区间 i 到 j 变成回文的最小代价。那么对于dp【i】【j】有三种情况首先:对于一个串如果s【i】==s【j】,那么dp【i】【j】=dp【i+ 阅读全文
posted @ 2017-08-07 09:34 demianzhang 阅读(281) 评论(0) 推荐(0)
摘要:以LeetCode-300为例: O(n^2)解法: dp数组表示以i结尾的最长递增子序列的长度 O(nlogn)解法: tails[i]数组定义:长度为i+1最长递增子序列的最小值末尾值 以nums[4,5,6,3]为例 阅读全文
posted @ 2017-05-18 20:08 demianzhang 阅读(584) 评论(0) 推荐(0)
摘要:在N进制下给你一个数,要你转换成最小的十进制数; 状态转移方程:从前向后 dp[j]表示j位前数列的最小十进制数 程序: 阅读全文
posted @ 2017-04-24 21:55 demianzhang 阅读(211) 评论(0) 推荐(0)