動態規劃 1

2021-10-08 17:25:58 字數 1454 閱讀 7780

dynamic programming

dp定義:

動態規劃是分治思想的延伸,通俗來說是大事化小,小時化了的藝術。

在將大問題化解為小問題的分治過程中,儲存堆這些小問題已經處理好的結果,並供後面處理更大的問題時直接使用這些結果。

動態規劃具備了以下三個特點:

1、把原來的問題分解成了幾個相似的子問題;

2、所有的子問題都只需要解決一次;

3、儲存子問題的解;

動態規劃的本質,是對問題狀態的定義和狀態轉移方程的定義(狀態以及狀態之間的遞推關係)

動態規劃問題一般從以下四個角度考慮:

1、狀態定義;

2、狀態間的轉移方程定義;

3、狀態的初始化;

4、返回結果;

狀態定義的要求:定義狀態一定要形成遞推關係;

一句話概括:三個特點四個特點兩個本質

適用場景:最大值/最小值,可不可行,是不是,方案個數

1、斐波那契數列

斐波那契數列

法一:

class

solution

};

法二:典型的動態規劃問題

(利用該方法比上面遞迴法更高效)

狀態:第i項的值(結果能夠反饋到問題的解上)

狀態的轉移方程:通過前面儲存的結果推導後面來的結果

f(i) = f(i-1) + f(i-2) ;

初始狀態:兩項,因此初始狀態需要兩項

f(0) = 0 , f(1) = 1

返回結果:f(n)

class

solution

return f[n];}

};

class

solution

return fn ;}}

;

問題:字串s是否可以被分割–>抽象狀態

狀態:(相似的子問題)某乙個字串是否能被分割,判斷區域性是否可以被分割

f(i) :字串前i個字元是否可以被分割

轉移方程:

以"leetcode"為例

f(4) :前四個字元是否可以被分割:true

f(8):f(4) && [5,8]是否可以在詞典中找到:true

f(1) && [2,8] (原始看分割和新增可分割即最終可分割)

f(2) && [3,8]

f(3) && [4,8]

f(4) && [5,8]

f(5) && [6,8]

f(6) && [7,8]

f(7) && [8,8]

f(0) && [1,8] --> 整體判斷例如該問題的f(4)

f(j) : j#include

class

solution}}

return canbreak[s.

size()

];}}

;

動態規劃1

維基百科 動態規劃是一種在數學和 電腦科學 中使用的,用於求解包含 重疊子問題 的最優化 問題的方法。其基本思想是,將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。動態規劃的思想是多種演算法的基礎,被廣泛應用於電腦科學和工程領域。比較著名的應用例項有 求解 最短路徑 問題,揹...

動態規劃 1

動態規劃是對最優化問題的一種新的演算法設計方法。由於各種問題的性質不同,確定最優解的條件也互不相同,因而動態規劃的沒計法對不同的問題,有各具特色的表示方式。不存在一種萬能的動態規劃演算法。但是可以通過對若干有代表性的問題的動態規劃演算法進行討論,學會這一設計方法。多階段決策過程最優化問題 動態規劃的...

動態規劃1

首先,動態規劃的最基本要求在於無後效性 即結果態之和之前某態有關,並且對於該之前態我們並不關心它到底是怎麼來的 和n到n 1的跳躍一樣,它也是依賴轉移方程得來。比如0 1揹包 我們只要永遠依賴dp i j max dp i 1 j,dp i 1 j wi vi 這個轉移方程即可,並不在乎它具體細節。...