
动态规划
文章平均质量分 92
qq_37357873
这个作者很懒,什么都没留下…
展开
-
分治-递归实现-巨人与鬼
巨人和鬼一组n个巨人正与n个鬼进行战斗,每个巨人的武器是一个质子炮, 它可以把一串质子流射中鬼而把鬼消灭。质子流沿直线行进,在击中鬼时就终止。巨人决定采取下述策略。他们寻找鬼配对,以形成n个巨人─鬼对,。然后每个巨人同时向他选取的鬼射出一串质子流。我们知道,让质子流互相交叉是很危险的。因此巨人选择的配对方式应该使质子流都不会交叉。假定每个巨人和每个鬼的位置都是平面上的一个固定点,并且没有三个位置共线, 求一种配对方案。解题思路:由题意知,其必存在一个解,这里利用分治的思想,利用一条线,把原区域分为两个区原创 2020-10-19 15:53:46 · 147 阅读 · 0 评论 -
动态规划-矩形嵌套问题(递归法实现)
矩形嵌套问题【题目描述】有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度)。例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中。你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内。如果有多解,矩形编号的字典序应尽量小。【分析】矩形之间的"可嵌套"关系是一个典型的二元关系,二元关系可以用图来建模。如果矩形X可以嵌套在原创 2020-10-21 10:55:01 · 1498 阅读 · 0 评论 -
动态规划总结:题目类型-设计流程-框架
带备忘录的递归-自顶向下自顶向下主要是定义dp函数参数:状态返回值:要求的数值备忘录:memo[state],=初始化值,还未计算过;!=初始化值,状态state的结果值先初始化整个备忘录,用一个正常情况下结果取不到的值进行初始化整个备忘录,说明还没被计算过。例如结果都是大于零的数,则初始化为0;如果结果能取到零,就初始化为-1: memo(memo,-1,sizeof(memo))注意 如果用特殊值表示“还没计算过“,必须和其他特殊值区(比如无解)区分开。//这里是把结果数组和备忘录合在一起原创 2020-10-21 16:49:53 · 242 阅读 · 0 评论 -
经典面试题-最长回文子串(双指针、dp)/子序列(dp)
回文串的的长度可能是奇数,也可能是偶数,这就添加了回文串问题的难度,解决该类问题的核心是双指针关于双指针的总结labuladong这道题如何使用双指针呢?寻找回文串的问题核心思想是:从中间开始向两边扩散来判断回文串for 0 <= i < len(s): 找到以 s[i] 为中心的回文串 找到以 s[i] 和 s[i+1] 为中心的回文串 更新答案动态规划也可以解决,时间复杂度一样,但是空间复杂度为O(n2)O(n^2)O(n2)存储dp[][]...原创 2020-10-28 18:13:40 · 594 阅读 · 0 评论 -
动态规划-子序列问题模板-题目延伸
1.一个一维数组dp[]最长上升子序列动态规划的时间复杂度O(n)O(n)O(n)二分查找:O(nlogn)O(nlogn)O(nlogn),纸牌问题:纸牌只能摞在比他大的纸牌上,如果当前没有堆可以放,就另起一堆,如果有多个堆都能放,就放在最左边的堆。有几堆纸牌最长上升子序列的长度就是几。变相等价于,用二分查找找左边界。if(a[mid]>=v) y=mid;else x=mid+1;2.一个二维数组dp[][]2.1涉及两个字符串最长公共子序列LCS2.2涉及一个字符串...原创 2020-10-28 21:34:28 · 212 阅读 · 0 评论 -
动态规划-股票买卖问题
labuladong股票买卖非模板(k=1只需一维数组)1.定义dp[i]dp[i]表示第i天所能获得的最大利润2.状态转移方程当price[i]<=price[i-1]时:dp[i]=dp[i-1]当price[i]>price[i-1]时:dp[i]=price[i]-min(price[0~i-1])这里如果要找min(price[0~i-1])可以for循环遍历,但是这样时间复杂度会变成$O(n^2),一个优化时间复杂度的方法是用一个变量min_price维护目前的最低股原创 2020-11-09 13:12:00 · 197 阅读 · 0 评论 -
动态规划-打家劫舍问题的思考
打家劫舍labuladong1.原始打家劫舍自底向上的解法中,对dp[i]的定义首先我想到的是dp[i] 表示 从当抢劫完前0~i个房子的时候能获得的最多的钱对打家劫舍系列第一题是可以得到解的,代码如下:for(int i=0;i<n;i++){ if(i==0) dp[i]=nums[i]; else if(i==1) dp[i]=max(nums[i-1],nums[i]); else{ dp[i]=max(dp[i-1],dp[i-2]原创 2021-08-07 10:24:12 · 170 阅读 · 0 评论 -
背包问题的整理
dp[i][j]:装前i个物品,背包的可装空间为j的情况下,问题的解(1)能装的最大价值(不一定要装满,只要价值最大)(2)恰好将背包装满的最大价值(3)恰好将背包装满有多少种装法01背包完全背包恰好将背包装满【问题】将硬币凑成指定面值,可以有多少种组合方式?硬币问题dp[i][j]表示使用前i种硬币,总面值为j的时候,最多有几种组合方式总面值=背包容积每种硬币面值=每种物品重量状态转移:不用第i种硬币+用第i种硬币dp[i][j]=dp[i-1][j]+dp[i][j-coin[i原创 2020-11-22 23:25:36 · 420 阅读 · 0 评论 -
高楼扔鸡蛋-算法小抄笔记
labuladong高楼扔鸡蛋问题【理解题目】最坏情况下,至少扔几次鸡蛋,找到鸡蛋恰好不会碎的楼层最坏情况:不管用什么策略,鸡蛋破碎一定发生在穷举尽搜索空间的时候。比如总共7层楼,用线性搜索,从第一层开始往上,搜索到第七层鸡蛋碎,这就是最坏情况用二分搜索,鸡蛋在第七层破碎,需要扔第一次(1+7)/2=4,(5+7)/2=6, 7,三次才破碎,这就是二分的最坏情况至少几次:如果不限制鸡蛋的个数,那么二分就是最少的搜索次数(即使是最坏情况下最多是logn次)【先考虑只有两个鸡蛋的情况,在第i层扔第原创 2021-08-07 10:21:24 · 235 阅读 · 0 评论 -
贪心算法之跳跃游戏
【题目】问题一:能否跳到终点如何判断能否到终点?只要某个点x,满足x+nums[x]>=终点的index,那么就可以到达终点,同时需要满足x是可以到达的如何判断x是否能到达?同理,只要能到达某个点i,满足i+nums[i]>=x,那么x就是能到达的我们维护一个farthest,就是目前能到达的最远的点,表示从0-farthest的中间所有点都可以通过某种跳跃方式到达;遍历数组的过程中更新farthest当farthest>=终点index的时候,就说明能到终点当farthe原创 2020-11-25 20:17:36 · 241 阅读 · 0 评论