前言
动态规划入门学习文章记录及总结
动态规划算法的基本思想是:将待求解的问题分解成若干个相互联系的子问题,先求解子问题,然后从这些子问题的解得到原问题的解;对于重复出现的子问题,只在第一次遇到的时候对它进行求解,并把答案保存起来,让以后再次遇到时直接引用答案,不必重新求解。动态规划算法将问题的解决方案视为一系列决策的结果
一、斐波那契数列
输入描述:
一个正整数n
返回值描述:
输出一个正整数。
示例1
输入:4
返回值:3
思路:
简单动态规划的思路就是找到状态方程,本题斐波那契已经给出了状态方程,算是最简单的入门题了。
自己对于动态规划方法的理解,最难的就是在找状态方程这里,需要通过题目去分析,这题的话没有好分析的,下一题在分析吧
这里我们直接使用已给出的状态方程,和已经给出的初始化,可以直接写代码!
class Solution:
def Fibonacci(self , n: int) -> int:
#特殊情况
if n < 2:
return n
#建立保存状态的数组
dp = [0 for i in range(n+1)]
#初始化状态
dp[0] = 0
dp[1] = 1
for i in range(2, n+1):
#书写状态方程
dp[i] = dp[i-1] + dp[i-2]
return dp[n]
简单的动规一定要对题目进行分析,写出状态方程,做好初始化
二、爬楼梯
描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
示例1
输入:2
返回值:2
思路:
由题我们知道,如果上0级台阶时,是只有一种方法的,上一级台阶也是一种方法,上两级台阶的话可以有两种,根据分析我们就能够知道初始化的状态和状态方程了。所以经过简单的分析,我们便可以直接写代码啦
class Solution:
def jumpFloor(self , number: int) -> int:
dp = [0 for i in range(number+1)]
dp[0] = 1
dp[1] = 1
for i in range(2, number+1):
dp[i] = dp[i-1] + dp[i-2]
return dp[number]
总结
动态规划最难在于什么时候适用,自己还在学习摸索,以及一个状态方程的书写,这个也要根据题目意思去理解。
如果是应对面试的话,把几种常见的动态规划题型先掌握一遍先