動態規划-爬樓梯問題


其實我一直分不清楚動態規划和分治,遞歸之間的區別與聯系。。。<( ̄3 ̄)> 三者之間應該是有點關系的吧

網上說:

1. 什么是動態規划?
         和分治法一樣,動態規划(dynamicprogramming)是通過組合子問題而解決整個問題的解。
         分治法是將問題划分成一些獨立的子問題,遞歸地求解各子問題,然后合並子問題的解。
         動態規划適用於子問題不是獨立的情況,也就是各子問題包含公共的子子問題。
         此時,分治法會做許多不必要的工作,即重復地求解公共的子問題。動態規划算法對每個子問題只求解一次,將其結果保存起來,從而避免每次遇到各個子問題時重新計算答            案。
2. 動態規划算法的設計
兩種方法:
         自頂向下(又稱記憶化搜索、備忘錄):基本上對應着遞歸函數實現,從大范圍開始計算,要注意不斷保存中間結果,避免重復計算
         自底向上(遞推):從小范圍遞推計算到大范圍
動態規划的重點:
         遞歸方程+邊界條件.

例題: 一個人每次只能走一層樓梯或者兩層樓梯,問走到第80層樓梯一共有多少種方法。

第一次提交,我的答案:說是時間超出限制了。。。。。實際上看我寫的,是一種函數的遞歸調用,算法書上(李清勇)對函數的遞歸調用談到了一個重疊子問題,修改方法就是先用數組將前面的計算結果存儲起來。要用的時候直接拿出來用就行。

public class Solution {
public int climbStairs(int n) {

if(n==1)
return 1;
else if(n==2)
return 2;
else
return climbStairs(n-1)+climbStairs(n-2);
}
}

修改:

public int climbStairs(int n) {
    	if (n == 0 || n == 1 || n == 2) {
    		return n;
    	}
        int[] r = new int[n+1];
        r[1] = 1;
        r[2] = 2;
        for (int i = 3; i <= n; i++) {
        	r[i] = r[i-1] + r[i-2];
        }
        return r[n];
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM