动态规划问题

动态规划一般思路

动态规划的条件
  1. 无后效性
  2. 具备最优子结构
经典例题
背包问题(01背包,完全背包),丢鸡蛋问题,青蛙跳台阶问题,最长上升子序列
思考过程
  1. 判断是否满足dp解题的条件;
  2. 确定问题中的状态是什么
  3. 根据题目中的逻辑关系推导出状态转移方程
  4. 填充边界条件,也是初始化条件
  5. 思考是否可以进行剪枝操作或着动态规划数组的降维

LeetCode 198 打家劫舍

题目

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

示例:
输入: [1,2,3,1]
输出: 4
解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
偷窃到的最高金额 = 1 + 3 = 4 。

解题

考虑所有的数字组合显然是不必要的,首先要分析如何找到最优解:

  1. 当n=1时, max_money(0) = nums[0]
  2. 当n=2时, max_money(1) = nums[1]
  3. 当n=3时,这时最优解有两种情况,一种是max_money(0)+nums[2],一种是max_money(1)。因此 max_money(2) = max(max_money(0)+nums[2], max_money(1))

总结以上规律后就可以找到求解最优值的公式,也即动态规划的状态转移方程:
max\_moeny(k)=max(max\_money(k-2)+nums[k],max\_money(k-1))

class Solution:
    def rob(self, nums: List[int]) -> int:
        pre_max = cur_max = 0
        for n in nums:
            tmp = cur_max
            cur_max = max(pre_max+n, cur_max)
            pre_max = tmp
        return cur_max

复杂度分析:

时间复杂度:O(n)

空间复杂度:O(1)

LeetCode300 最长上升子序列

题目

​ 给定一个无序的整数数组,找到其中最长上升子序列的长度。

示例:

输入: [10,9,2,5,3,7,101,18]
输出: 4 
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
解题

​ 本题采用动态规划算法,首先看是否满足动态规划算法的两个条件。

​ 第一,结果的无后效性,这一点显然是满足的,因为S(n)的最长子序列的结果,并不会影响到S(n+1)的最长子序列结果。

​ 第二,就是寻找最优子结构,找到问题的最优子结构,我们就能找出状态转移方程。

​ 首先,我们要明确这个问题中我们应该定义的状态,根据题意,我们可以定义状态为以当前数字为结尾的最长上升子序列。

​ 然后我们要寻找状态方程,也即问题中的最优子结构,对于第i个数,我们可以根据nums[i]与nums[j] (j<i)之间的大小关系,求的dp[i]。因此有如下关系:
dp[i]=max(m(j)) \ \ \ j<i\\ m[j] = dp[j]+1 \ if \ nums[i] > nums[j] \ else \ dp[i]
​ 在确定了状态转移方程之后,我们需要明确边界条件,在一开始时,所有的位置上的最长上升子序列长度都应该为1,即:
dp[i]=1(i=[0:len(nums)])
​ 这样我们就完成了动态规划算法的设计,用python代码实现如下:

class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        l = len(nums)
        if not l:
            return 0
        
        dp = [1]
        
        for i in range(1,l):
            dp.append(1)
            for j in range(i):
                if nums[i] > nums[j]:
                    dp[i] = max(dp[i], dp[j]+1)
        return max(dp)        
复杂度分析

时间复杂度: 两重遍历,O(n^2)

空间复杂度: dp数组,O(n)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352

推荐阅读更多精彩内容