2. 动态规划 Dynamic Programming

动态规划笔记 dynammic programming notes

Table of contents


<h2 id="def_dp">动态规划 Dynamic Programming</h2>

动态规划(英语:Dynamic programming,简称DP)是一种在数学管理科学计算机科学经济学生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。

动态规划常常适用于有重叠子问题[1]最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。

动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。

通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量:一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。


  • 动态规划问题的本质:求最值

  • 原问题 <=> 若干个类似的独立子问题

    • 状态转移方程

解决动态规划问题的一般流程

  1. 确定 state

    即区分原问题和子问题的量,一般为 dp function的自变量或dp array的index
    e.g 原问题为dp(n), 子问题为dp(n-1)

  2. 确定 base state case

    一般为state=0的情况, 即dp(0)dp[0]

  3. 确定 strategy

    即原问题分解成子问题*的不同方法
    e.g.
    dp(n) \\= dp(n-1) + 2 \\=dp(n-2) + 1

  4. 定义 dp functiondp array (状态转移方程)

    根据strategy列出方程

    • 自顶向下: dp function
      dp(n) = \min(dp(n-1)+2, dp(n-2)+1)

      • 可能会重复计算某些子问题 => 用hash table储存已经计算了的子问题
      • 时间复杂度,空间复杂度都很高
  • 自底向上

    #原问题的状态
    state_original_problem = 11
    
    #dp数组
    dp = [some big value] * (state_original_problem+1)
    
    #base state
    dp[0] = dp[1] = 0
    
    #自底向上
    for i in range (2,len(dp)):
      dp[i] = min(dp[i-1]+2,dp[i-2]+1)
    
    #返回结果
    return dp[-1]
    
    • Time complexity O(n), space complexity O(n)

    • Optimisation: 若dp[n]只与dp[n-1], dp[n-2]有关,则可以用滚动数组的思想优化

      dp_i = 0 #dp[n-2]
      dp_j = 0 #dp[n-1]
      
      for i in range(2,n+1):
        dp_n =  min(dp_i+1,dp_j+2)
        dp_i = dp_j
        dp_j = dp_n
      
      return dp_j
      

      Space complexity: O(1)

Reference:

知乎


Examples

<a href="https://leetcode-cn.com/problems/maximal-rectangle/" id = "exa1">85. Maximal Rectangle</a>

Given a rows x cols binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and return its area.

Example 1:

img
Input: matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
Output: 6
Explanation: The maximal rectangle is shown in the above picture.

动态规划思想:

heights[i][j]代表[i,j]的高度
heights[i][j] = matrix[i][j]=='1'? heights[i-1][j] + 1:0

dp[i][j][k] 代表以[i,j]为右下角,高度为k可以组成的最大面积
dp[i][j][k] = matrix[i][j]=='1'? dp[i][j-1][k] + k : 0
IMG_0685

代码:

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

推荐阅读更多精彩内容