码迷,mamicode.com
首页 > 其他好文 > 详细

动态规划面试题型归类机

时间:2020-08-14 23:24:47      阅读:80      评论:0      收藏:0      [点我收藏+]

标签:obs   输入一个正整数n   python   最小   函数   一个   code   nat   维数   

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)= \begin{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];
}

动态规划面试题型归类机

标签:obs   输入一个正整数n   python   最小   函数   一个   code   nat   维数   

原文地址:https://www.cnblogs.com/xytpai/p/13502563.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!