动态规划面试题型归类机

Posted xytpai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划面试题型归类机相关的知识,希望对你有一定的参考价值。

1. 路径数目问题

  • 1.1. 一维路径数目
题目概述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

解法
第一步找到适用于该题的状态表示,这里把状态函数设定为f(n),即跳了n个台阶的跳法总数。现在需要通过先前的信息推导f(n),假设青蛙跳了n格,如果它是1跳到n格的,那么一共f(n-1)种跳法;如果是2跳到n格的,那么一共f(n-2)种跳法,所以一共有f(n-1)+f(n-2)种跳法。

[f(n)= egin{cases} 1 & n=1 2 & n=2 f(n-1) + f(n-2) & n>2 end{cases} ]

  • 1.2. 二维路径数目
题目概述
有一个障碍表(二维数组),1表示有障碍不能走,0可以走,只能向右一格或向下一格走
找到从左上角到右下角一共的路径数目
def uniquePathsWithObstacles(self, obstacleGrid):
    # type obstacleGrid: List[List[int]]
    row = len(obstacleGrid)
    col = len(obstacleGrid[0])
    dp = [[1] * col for i in range(row)]
    for i in range(0, row):
        for j in range(0, col):
            if obstacleGrid[i][j]: # 如果这个点是障碍
                dp[i][j] = 0
            elif i == 0:
                dp[i][j] = dp[i][j-1]
            elif j == 0:
                dp[i][j] = dp[i-1][j]
            else:
                dp[i][j] = dp[i-1][j] + dp[i][j-1]
    return dp[-1][-1]
  • 1.3. 串路径数目
题目概述
‘A‘到‘Z‘用数字1~26表示
Input: "12"
Output: 2
12可以有两种编码方式 "AB" (1 2) or "L" (12).

解法
相当于从字符串首到尾找路径数目
def numDecodings(self, s):
    if len(s)==0 or s[0]==‘0‘: return 0
    dp = [1,1]
    for i in range(2, len(s)+1):
        if s[i-2:i]==‘10‘ or s[i-2:i]==‘20‘:
            dp.append(dp[i-2])
        elif 10<int(s[i-2:i])<=26:
            dp.append(dp[i-1]+dp[i-2])
        elif s[i-1]!=‘0‘:
            dp.append(dp[i-1])
        else:
            return 0
    return dp[-1]

2. 路径耗费问题

  • 2.1. 二维路径耗费
题目概述
非负二维数组,找到从左上角到右下角的路径,使元素和最小的那个最小值
只能向右一格或向下一格走

解法
设定状态dp[row][col]表示从左上角走到row行col列元素和最小的路径的元素和大小

[dp[row][col] = min(dp[row][col-1], dp[row-1][col]) + matrix[row][col] ]

题目概述
[
     [2],
    [3,4],
   [6,5,7],
  [4,1,8,3]
]
给以上这种三角形,返回从顶到底的元素和最小走法(每次只能走邻近子节点)
比如以上的结果:2 + 3 + 5 + 1 = 11

[dp[row][i] = min(dp[row+1][i], dp[row+1][i+1]) + triagnle[row][i] ]

3. 数字拆分问题

  • 2.1. 求拆分数目
题目概述
Input: n = 13
Output: 2
Explanation: 13 = 4 + 9.
输入一个正整数n, 输出其最少能由几个完全平方数相加组成(完全平方数为1,4,9,16,...)

解法:

[dp[n] = min(dp[n-s]+1), s in 1,4,9,16,... ]

int numSquares(int n) {
    int *dp = new int[n + 1];
    dp[0] = 0;
    for (int i=1; i<=n; i++) {
        int _min = INT_MAX;
        for (int j=1; j*j<=i; j++) {
            _min = min(_min, dp[i-j*j]+1);
        }
        dp[i] = _min;
    }
    delete[]dp;
    return dp[n];
}

以上是关于动态规划面试题型归类机的主要内容,如果未能解决你的问题,请参考以下文章

干货 | 动态规划高频题大汇总

动态规划高频题汇总 | 今日直播划重点

清华学霸的解题秘籍,拿下动态规划就4步!

动态规划(Dynamic Programming)LeetCode经典题目

动态规划多种题型

动态规划题型