演算法設計與分析 十一 動態規劃

2021-08-31 15:49:54 字數 1699 閱讀 4797

這題是典型的卡特蘭數的例子,首先我們先來了解一下卡特蘭數是什麼,

其遞推公式為

這道題就是根據這個遞推公式進行求解。

對於這題,遞推公式的具體含義是:

dp[0] = 1

dp[1] = 1代表是1作為根,則明顯有一種情況。

dp[2] = dp[0] * dp[1] + dp[1]*dp[0], 代表有兩個數,當1為根時,有dp[0]*dp[1]種情況;當2為根的時候,有dp[1]*dp[0]種情況。

dp[n] = dp[0]*dp[n-1] + dp[1][n-2] + … +dp[n-1]*dp[0]

根據上述的推導過程,我們可以容易得出狀態轉移方程:

這題是第一題的加強版,這次不是求二分搜尋樹的不同種類,而是將具體每一種情況都求出來,這意味著我們需要記錄好每種二分查詢樹的狀態。

由於這些狀態是相對連續的過程,所以這題我們可以與矩陣乘法的動態規劃實現做模擬。

我們用dp[i][j]表示從i開始到j這個子問題的解的狀態,而對應的這個狀態我們可以在dp[i][j]中多加一維來記錄。

同樣的道理,我們將dp[i][j]這個狀態分成dp[i][k-1]和dp[k+1][j]兩格狀態來解決。

除了這些以外,我們還需要注意樹的構建,在分解為子問題的時候,注意要維持樹的狀態。

/**

* definition for a binary tree node.

* struct treenode

* };

*/class solution

for(int i = 0; i < n+1; i++)

//find range from i to j

for(int len = 2; len <= n; len++) : dp[i][k - 1];

vectorright = (k + 1 > j) ? vector < treenode* > : dp[k + 1][j];

for(int p = 0; p < left.size(); p++) }}

}}return dp[1][n];}};

演算法設計與分析 動態規劃

最大子段和問題 給定由n個整數 包含負整數 組成的序列a1,a2,an,求該序列子段和的最大值。i.當所有整數均為負值時定義其最大子段和為0。所求的最優值為 i.例如,當 a1,a2,a7,a8 1,3,7,8,4,12,10,6 時,最大子段和為 bj是1到j位置的最大子段和 由bj的定義易知,當...

演算法設計與分析 動態規劃

分治技術的問題 子問題是相互獨立的 如果子問題不是相互獨立的,分治演算法將重複計算公共子空間,效率很低 提高效率的方法 從規模最小的子問題開始計算 用恰當資料結構儲存子問題的解,供以後查詢 確保每個子問題只求解一次 優化問題 給定一組約束條件和乙個代價函式,在解空間中搜尋具有最小或最大代價的優化解 ...

演算法之一動態規劃

問題描述 給定n種物品和一揹包。物品i的重量是wi,其價值為vi,揹包的容量為c。問應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?對於一種物品,要麼裝入揹包,要麼不裝。所以對於一種物品的裝入狀態可以取0和1.我們設物品i的裝入狀態為xi,xi 0,1 此問題稱為0 11揹包問題。資料 物...