大數據算法系列15:動態規劃 一. 動態規劃概念 二. 動態規劃案例 參考:

一. 動態規劃概念

僞代碼:

重構:

二. 動態規劃案例

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);
        }
    }

}

參考:

  1. http://www.dataguru.cn/article-5747-1.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章