动态规划算法
本质上是这步的“价值”由上一步决定,比如求公共最长子序列:
例子(来源 算法图解)
用户在使用搜索引擎,比如搜索fosh。那我们就要猜测用户是想要搜索fish还是fort.怎么求取公共最长子序列。做一个4*4网格,每个网格的计算方式都由上一格来决定。
if word_a[i] == word_b[j]:
cell[i][j] = cell[i-1][j-1] + 1
else:
cell[i][j] = max(cell[i-1][j], cell[i][j-1])
最终填满方格的结果就是答案。
leetcode 70题 爬楼梯 经典题型
n个台阶,一次走1阶或者2阶。共有几种走法?
其实这个是一个斐波那契数列,n=1的时候1种,n=2时2种。在n阶时,要么就从n-1上来,要么就从n-2上来,所以n时的方法数就是n-1和n-2两个台阶上方法的和。
class Solution:
def climbStairs(self, n: int) -> int:
if n <= 2:
return n
dp = [0] * n
dp[0] = 1
dp[1] = 2
for i in range(2, n):
dp[i] = dp[i-1] + dp[i-2]
return dp[n-1]
或者使用经典的做法:(简化到最优了)
class Solution:
def climbStairs(self, n: int) -> int:
a = 1
b = 1
for i in range(1, n+1):
a, b = b, a + b #此时i=1,a=1 i=2,a=2 i=3,a=3
return a