動態規劃(C )

2021-10-20 17:38:40 字數 1167 閱讀 6136

動態規劃問題,大致可以分為兩類:

一是最優解問題,其目的是求某個問題的最小值或最大值。

如:10000以內的k好數中任選三個的和,最大值為多少。

二是組合問題,其目的是求某個事情發生的概率。

如:長度為x的數字字串,可以分解為4個小於255的數字,可以有多少種組合方式。

面對這兩種問題的解決方案也有兩種:

自上而下(記憶儲存):從頂端開始分解問題,分解到最小並解決,然後返回儲存的答案。如斐波拉契數列問題的遞迴求法便是記憶儲存法。

自下而上(**填充):先解決較小的子問題,由子問題的解推算出後續問題的解,從而得到最佳解法。如斐波拉契數列問題的遞迴求法便是**填充法。

至於什麼情況下使用什麼方法,還需要具體情況具體分析。

如數學三角形問題(動態規劃);

在輸入的數學三角形中尋找一條從頂部到底部的路徑,使得路徑上所經過的數字之和最大。路徑上的每一步都只能往左下或右下行進。只需給出最大和,不需給出具體路徑。

1《三角形行數<100,0《數字<99

輸入格式:

5//行數

73 8

8 1 0

2 7 4 4

4 5 2 6 5

輸出格式:

30

自頂向下的解法:

#include #include using namespace std;

void math_********_top()

else

}k+=1;

}//開始一層,一層的計算,更新狀態陣列

for (int i=1;imy_vector[i-1][j-1])

else}}

}}

cout<<"狀態陣列值為:"《自下而上的解法:

#include #include using namespace std;

void math_********_end()

else

}k+=1;

}//開始自下而上的計算,更新狀態陣列

for (int i=1;imy_vector[i-1][j+1])

else}}

}//輸出所有值

cout<<"狀態陣列值為:"《總結:動態規劃,其實就是弄乙個狀態矩陣,記錄計算過程中每一步的計算結果,並將每次的計算結果進行乙個累加,由此得到最終的答案。

C 動態規劃DP

動態規劃 將子問題的解記錄下來,記憶花搜尋 狀態 dp i j 狀態轉移方程 從邊界開始 底開始 往上走,第 i j 的狀態就是最大的加上它自己。dp i j max dp i 1 j dp i 1 j 1 f i j 邊界就是他自己 for int j 1 j n j 從倒數第二層開始 for i...

C 打家劫舍 動態規劃

在一條直線上,有n個房屋,每個房屋中有數量不等的財寶,有乙個盜賊希望從房屋中盜取財寶,由於房屋中有報警器,如果同時從相鄰的兩個房屋中盜取財寶就會觸發報警器。問在不處罰報警器的前提下,最多可獲取多少財寶?include include class solution solution introb st...

c 動態規劃筆記

7 3 88 1 0 2 7 4 4 4 5 2 6 5 7 3 8 7 5 30 定義狀態f i j 表示從 1,1 出發走到 i,j 所有路徑的最大和 要注意狀態轉移的順序 f i j max f i 1 j f i 1 j 1 int main int dp 5 5 dp 0 0 a 0 0 ...