动态规划面试题型归类机
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];
}
以上是关于动态规划面试题型归类机的主要内容,如果未能解决你的问题,请参考以下文章