動態規劃 小白入門

2021-10-24 14:25:55 字數 1819 閱讀 1757

首先引入知乎大佬的一篇文章

一、青蛙跳台階

1、經典爬樓梯

這是一道動態規劃入門題目,關鍵在於初始值取值的問題,不能忽略第二階台階也是初始值,因此也要初始化。

class solution 

return dp[n];

}};

這道題是把兩種上台階方法變成了三種,可以當作爬樓梯類題練習

2、爬樓梯變形

這道題困擾了我很久,可能還是太菜了的緣故。首先的困難在dp陣列的定義,這道題要求到達樓頂的最小花費,因此我們設dp[i]為到達第i階樓頂的最小花費,那麼狀態轉移方程就可以寫為dp[i]=min(dp[i-1]+cost[i], dp[i-2]+cost[i-1])不太容易理解,也就是說到達第i階樓頂的最小花費等於到達第i-1階樓頂(也就是第i階樓梯)的最小花費加上第i階的最小花費(相對於cost陣列來說的)...的最小值。

class solution 

for(int i=1;i<=n;i++)

for(int i=2;i<=m;i++)

}return dp[m][n];

}};

2、最小路徑和

這和上面那道機械人尋路問題解法根源上是一樣的,只不過在dp陣列的意義及dp陣列值得出的方式上有些變化。還是使用二維陣列儲存每個點的最小路徑和,每個點的最小路徑和等於它左邊節點和上面節點最小路徑和的最小值再加上該節點本身的值。需要注意的是初始化的時候要初始化第一列和第一行。

class solution  

for(int i=0;i<=n2;i++)

for(int i=1;i<=n1;i++)

else

dp[i][j] = 1 + min(min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1]);}}

return dp[n1][n2];

}};

四、最長遞增序列

1、最長連續遞增序列

循序漸進,先來一道比較簡單的遞增序列問題。這道題dp陣列定義顯而易見,即dp[i]是以nums[i]結尾最長連續子串行的長度,問題迎刃而解。空間優化的話就是用乙個int變數儲存當前值,用乙個儲存最大值即可。

class solution 

else

first = 1;

}return res;

}};

五、揹包問題

1、0-1揹包問題

這種題我還沒在leetcode上見到。揹包問題的描述一般是,有一些物品的重量由weight陣列給出,價值由value陣列給出,問當揹包重量為w時能裝最大價值為多少?

首先dp陣列dp[i][j]定義為前i個物品的總重量,所以我們只需要dp取最大就行。那麼狀態轉移是怎麼樣呢?面對第i個物品有兩種選擇,第一種是不把它放入揹包,這時dp[i][j]和dp[i-1][j]是相等的;第二種是放入揹包,那麼dp[i][j]就等於前乙個狀態的最大價值和dp[i][j-value[i-1]]取最大值。再注意一下邊界值的問題就可以解決了。

2、完全揹包問題

這道題在leetcode上是以零錢兌換的形式出現的。

完全揹包和0-1揹包的區別在於物品數目是否無限。狀態轉移方程和之前的0-1揹包差不多,區別在於乙個求最大值,乙個求和

class solution 

for(int i=0;i<=coins.size();i++)

for(int i=1;i<=coins.size();i++)

}return dp[coins.size()][amount];

}};

動態規劃入門

1 用 dp 做的題大多數返回值是int boolean,求max min,不能打亂原來輸入順序。2 動態規劃有兩個重要定義,乙個叫 optimal substructure 另乙個叫 overlap subproblem 各種排序 tree 類問題中,都會用到 divide conquer 的思想...

動態規劃入門

大家可以看看這篇文章dp,哪個更容易理解就看哪個!一 動態規劃的定義 動態規劃程式設計是一種針對於解決最優化問題的一種途徑 一種方法,而不是一種特殊演算法,也就是說它沒有固定的模板。在動態規劃中,每走一步都要看看能不能最優,而且動態規劃最擅長的就是多階段問題!二 動態規劃的基本概和基本模型構成 1....

動態規劃入門

學動態規劃自然要從數字三角形開始起步,那麼我們就先從數字三角形開始。數字三角形題目 有乙個由非負整數組成的三角形,第一行只有乙個數,除了最下行之外的每個數的左下方和右下方各有乙個數,如下圖所示 3 24 10 1 4 3 2 20 從第一行的數開始,每次可以往下或往右下走一格,直到走到最下行,把沿途...