一. 動態規劃概念
僞代碼:
重構:
二. 動態規劃案例
2.1 青蛙跳臺階
題目:
一隻青蛙一次可以跳上1級臺階,也可以跳上2級臺階。求該青蛙跳上一個 n 級的臺階總共有多少種跳法。
這個題目就是用典型的動態規劃算法求解的,青蛙跳上一個n級臺階的跳法(記作f(n)),我們可以從青蛙的最後一步入手,將總的跳法分爲兩類:1 最後一步跳了一階。2 最後一步跳了兩階。易得f(n)=f(n-1)+f(n-2);這個就是狀態轉移方程。
代碼:
int numWays(int n){
//滾動數組
int head=1,behind=1;
int sum=0;
for(int i=0;i<n;i++){
//先求和,在滾動
sum=(head+behind)%1000000007;
head=behind;
behind=sum;
}
return head;
}
2.2 斐波那契列數
古典問題:
有一對兔子,從出生後第2個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問第二十個月的兔子對數爲多少?
1個月:1
2個月:2
3個月:3
4個月:5
5個月:8
6個月:13
7個月:21
規律:除了第一個月和第二月以外,其餘每個月都是前兩個月之和
斐波那契列數
如果不理解,可以參考圖解:
代碼:
package Java_study;
/**
*
* @author 只是甲
* @date 2021-07-01
* @remark 遞歸求斐波那契列數
*
*/
public class recursion2 {
public static void main(String[] args) {
System.out.println(method(1, 19));//開始1對兔子,19個月後共有6765對兔子
}
/**
* @remark month個月後 init個數量對兔子會發展成爲多少對兔子數
* @param init 初始兔子數量
* @param month 月份
* @return 結果兔子數量
*/
public static int method(int init, int month) {
//必須要有出口
//如果是第一個月,只有一對兔子
if (month == 1) {
return init;
} else if (month == 2) {
return init * 2;
} else {
return method(init, month - 2) + method(init, month - 1);
}
}
}