新博念 足球網(wǎng)站開發(fā)天津疫情最新情況
題目:理論基礎(chǔ)
文章鏈接:代碼隨想錄
?視頻鏈接:動(dòng)態(tài)規(guī)劃理論基礎(chǔ)
動(dòng)態(tài)規(guī)劃五部曲:
- 確定dp數(shù)組(dp table)以及下標(biāo)的含義
- 確定遞推公式
- dp數(shù)組如何初始化
- 確定遍歷順序
- 舉例推導(dǎo)dp數(shù)組
?題目:509. 斐波那契數(shù)
文章鏈接:代碼隨想錄
視頻鏈接:LeetCode:509.斐波那契數(shù)
題目鏈接:力扣題目鏈接
圖釋:
class Solution {
public:// 確定dp數(shù)組(dp table)以及下標(biāo)的含義 vector<int> dp, dp[i]表示第n哥斐波那契數(shù) // 確定遞推公式 dp[i]=dp[i-1]+dp[i-2]// dp數(shù)組如何初始化 dp[0]=1, dp[1]=1// 確定遍歷順序 從前往后// 舉例推導(dǎo)dp數(shù)組 int fib(int n) {if(n<=0)return 0;if(n==1) return 1;vector<int> dp(n+1);dp[0]=0;dp[1]=1;for(int i=2; i<=n; i++){//從2開始,直到第n個(gè)數(shù)dp[i]= dp[i-1]+dp[i-2];}return dp[n];}
};
class Solution {
public:int traversal(int n){// 終止條件if(n==1) return 1;if(n==0) return 0;// 遞歸return traversal(n-1)+traversal(n-2);} int fib(int n) { return traversal(n);}
};再精簡(jiǎn)
class Solution {
public:int fib(int n) { // 終止條件if(n==1) return 1;if(n==0) return 0;return fib(n-1)+fib(n-2);}
};
題目:70. 爬樓梯
文章鏈接:代碼隨想錄
視頻鏈接:LeetCode:70.爬樓梯
題目鏈接:力扣題目鏈接
圖釋:
class Solution {
public:// 確定dp數(shù)組(dp table)以及下標(biāo)的含義 vector<int> dp, dp[i]表示達(dá)到第n層樓梯需要的方法 // 確定遞推公式 dp[i]=dp[i-1]+dp[i-2]// dp數(shù)組如何初始化 dp[1]=1, dp[2]=2// 確定遍歷順序 從前往后// 舉例推導(dǎo)dp數(shù)組 // 題目中要求的每次可以爬1或者2個(gè)臺(tái)階,也就是說(shuō),最終到達(dá)n階臺(tái)階有兩種方式,// 一個(gè)是爬1階臺(tái)階到達(dá)(對(duì)應(yīng)的是從n-1階臺(tái)階開始)// 另一個(gè)就是爬2階臺(tái)階到達(dá)(對(duì)應(yīng)的是從n-2階臺(tái)階開始爬),// 而爬n-1階和n-2階臺(tái)階的方法有dp[n-1],dp[n-2]個(gè)// 所以最終爬n階臺(tái)階的方法種類就是dp[n-1]+dp[n-2]int climbStairs(int n) {if(n==1) return 1;if(n==2) return 2;vector<int> dp(n+1);dp[1]=1;dp[2]=2;for(int i=3; i<=n; i++){dp[i] = dp[i-1]+dp[i-2];}return dp[n];}
};
class Solution {
public:int climbStairs(int n) {if(n==1) return 1;if(n==2) return 2;return climbStairs(n-1)+climbStairs(n-2);}
}; //超時(shí)
題目:746. 使用最小花費(fèi)爬樓梯
文章鏈接:代碼隨想錄
視頻鏈接:LeetCode:746.使用最小花費(fèi)爬樓梯
題目鏈接:力扣題目鏈接
圖釋:
class Solution {
public:// 確定dp數(shù)組(dp table)以及下標(biāo)的含義 vector<int> dp, dp[i]表示爬到第n層臺(tái)階的最低花費(fèi)// 確定遞推公式 dp[i]= min(dp[i-1]+cost[i-1], dp[i-2]+cost[i+2]) 可以選擇從前一個(gè)臺(tái)階或者前兩個(gè)臺(tái)階爬上來(lái) // dp數(shù)組如何初始化 dp[0]=0, dp[1]=0 題目說(shuō)了,可以選擇從0或者1臺(tái)階出發(fā),也就是dp[i]到這兩個(gè)臺(tái)階的最低花費(fèi)為0// 確定遍歷順序 從前往后// 舉例推導(dǎo)dp數(shù)組 int minCostClimbingStairs(vector<int>& cost) {if(cost.size()==0 || cost.size()==1) return 0;vector<int> dp(cost.size()+1);dp[0]=dp[1]=0;for(int i=2; i<=cost.size(); i++){ // 頂樓表示為dp[n] dp[i]= min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2]);}return dp[cost.size()];}
};