1. 程式人生 > >動態規劃-重疊子問題

動態規劃-重疊子問題

規劃 tracking data const num uri 指數 ade class

動態規劃-重疊子問題

flyfish 2015-8-23

名詞解釋
重疊子問題 overlapping subproblems

動態規劃策略將問題分解為一個或者多個子問題

重疊子問題是一個遞歸解決方式裏包括的子問題盡管非常多,但不同子問題非常少。少量的子問題被重復解決非常多次。

比如LCS(最長公共子序列)問題,給定兩個序列X和Y,長度各自是m和n,窮舉子問題是指數級的,而不同子問題的數量僅僅是mn.

a recurisive algorithn for the problem solves the same subproblems over and over,rather than always generating new subproblems.
用來解原問題的遞歸算法能夠重復地解相同的子問題。而不是總在產生新的子問題。

over and over 重復。再三
rather than 而不是。寧可…也不願

When a recursive algorithm revisits the same problems repeatedly,we say that the optimization problem has overlapping subproblems.
當一個遞歸算法不斷地調用同一問題時,我們說該最優問題包括重疊子問題

revisit 英 [ri?’v?z?t] 美 [ri’v?z?t]
vt. 重遊;再訪;重臨
n. 再訪問

repeatedly 英 [r?’pi?t?dl?] 美 [r?’pit?dli]
adv. 重復地;再三地。屢次地

In contrast, a problem for which a divide-and-conquer approach is suitalbe usually generates brand-new problems at each step of the recursion.
相反地,適用於分治法解決這個問題往往在遞歸的每一個步上都產生全新的問題。

contrast英 [‘k?ntrɑ?st] 美 [‘kɑntr?st]
vi. 對照;形成對照
vt. 使對照;使與…對照
n. 對照;區別。對照物

divide-and-conquer
分治法

approach 英 [?’pr??t?] 美 [?’prot?]
n. 方法;途徑;接近
vt. 接近;著手處理
vi. 靠近

suitable 英 [‘su?t?b(?)l] 美 [‘sut?bl]
adj. 適當的。相配的

brand-new
adj. 嶄新的;近期獲得的

brand 英 [br?nd] 美 [br?nd]
vt. 銘刻於,銘記;打烙印於;印…商標於
n. 商標,牌子;烙印

以斐波那契數列為例說明

斐波那契數列指的是這樣一個數列:1、1、2、3、5、8、13
從第3個數開始。每一個數都是前面兩個數之和。
測試時 輸入的 n>=3,但也不要太大,防止溢出。
遞歸式

Consider again the recursive function for computing the nth Fibonacii number
.
再次考慮使用遞歸函數計算第n個斐波那契數。

    int Fibonacci(int n)
    {
        if( (1==n) || (2==n) )
        return 1;

        return Fibonacci(n-1) + Fibonacci(n-2);     
    }

調用 Fibonacci(7)。

存表方式
動態規劃算法總是充分利用重疊子問題。即通過每一個子問題僅僅解一次,把解保存在一個須要時就能夠查看的表中,而每次查表的時間為常數。


Dynamic-programming algorithms typically take advantage of overlapping subproblems by solving each subproblem once and then storing the solution in a table where it can be looked up when needed, using constant time per lookup.

typically 英 [‘t?p?k?l?] 美 [‘t?p?kli]
adv. 代表性地;作為特色地,典型地

take advantage of
利用

    int Fibonacci(int n,int* Values)
    {
        if(n<=2)
        return 1;

        Values[n]=Fibonacci(n-1,Values) + Fibonacci(n-2,Values);

        return  Values[n];  
    }

調用
int Values[8]={0,0,0,0,0,0,0,0};
Fibonacci(7,Values); 

不須要表存儲全部值。僅僅存儲前兩個值

int Fibonacci(int n)
    {
        long past,prev,curr;
        past=prev=curr=1;

        for(int i=3;i<=n;i++)
        {
            past=prev;      // past holds Fibonacci(i-2)
            prev=curr;      // past holds Fibonacci(i-1)
            curr=past+prev; // current now Fibonacciholds (i)
        }
        return curr;

    }


調用 Fibonacci(7)。

動態規劃-重疊子問題