1. 程式人生 > >動態規劃-DP

動態規劃-DP

遞推關系 向上 表達 曲線 color -m max 遞推 數學

Dynamaic Programming

定義&內容:

動態規劃是運籌學中用於求解決策過程中的最優化數學方法。作為算法設計技術,是一種使用多階段決策過程最優的通用方法。是解決最優化問題的重要工具。

多階段決策過程:

  • 百科:多階段決策是指決策者在整個決策過程中做出時間上先後有別的多項決策。它通常比只需做出一項決策的單階段決策要復雜,它或是要決策者一次確定各階段應選擇的一串最優策略,或是找出表示一個過程內連續變化的一條控制變量曲線,或是確定適合不同狀態的靈活策略
  • 總結:一次決策可以得到解的一部分,當做完所有決策就得到相應完整的解

什麽樣的問題適用DP

1)問題是由交疊的子問題所構成,大問題分解為小問題。

2)將交疊子問題的一次次求解\(\rightarrow\)子問題只求解一次,並將結果記錄保存。

3)利用空間(子問題存儲)來換取時間

keyword & main idea

  • 求解最優化問題
  • 是多階段決策問題
  • 交疊子問題(存在重復的子問題)
  • 子問題存儲,不求重復解
  • 自底向上的方法

求解步驟

多階段決策問題
初始狀態\(\rightarrow\)決策1\(\rightarrow\) 決策2 \(\rightarrow\)........\(\rightarrow\)決策n\(\rightarrow\)結束狀態

動態規劃三要素:

  • 問題階段
  • 每個階段的狀態
  • 一個階段如何進入下一個階段的遞推關系式

Tips :
可以列一個二維的表格,通過表格中元素進行規劃。

問題求解

先從最簡單的剪繩子(integer break product maximun)問題

int maxProductLength(int length){
    // 先進行判斷
    if(length<2) return 0;
    if(length==2) return 1;
    if(length==3) return 2;

    // 定義一個數組,存儲各個值
    // 交疊的子問題 的初始化
    int* product=new int[length+1];
    product[0]=0;
    product[1]=1;
    product[2]=2;
    product[3]=3;
    // 定義一個儲存最大值的變量
    int max=0;
    for(int i=4;i<length;++i){
        max=0;
        for(int j=1;j<=i/2;++j){
            // 遞推的表達式
            int product=product[i]*product[i-j];
            if(product>max)
                max=product;
        }
        product[i]=max;
    }
    max=product[length];
    delete[] product;
    return max;
}

動態規劃-DP