我以前一直覺得動態規劃就是01揹包問題,現在想來還真是傻得很,其實動態規劃是一種應用十分廣泛的一種分析問題的方法,基本的特點就是問題可以分解,即具有最優子結構性質,就是乙個問題可以分解成多個子問題來解而且在解得過程中狀態確定就是就是確定了,不再影響下乙個,其核心就是狀態和狀態轉移方程,就是先找到乙個思路,然後實現這個思路的辦法有很多種,一般來說遞迴會超時,方法就是記憶化搜尋和遞推,這兩個方法在數字三角中體現的比較明顯。
其中遞推是比較常用的方法,關鍵是邊界和計算順序。
一:遞推版本的數塔動歸☟
#include
using
namespace
std;
#include
int main()
return
0;}
二:記憶化搜尋版本的動歸☟
#include
using
namespace
std;
#include
int tower[105][105];
int summax[105][105];
int n;
int solve(int i, int j)
//這個遞迴函式可以說是寫得一級簡潔了,而且正確了
int main()
return
0;}
記憶化搜尋其實還是遞迴,只不過是把算過的數都記錄了下來,這樣就不需要重複計算了,可以節省比較多的時間!
就這道題來說,我個人覺得是遞推的版本好理解一些。
所以遞推其實就是分解問題→確定初始狀態和邊界值→找到合適的轉移方程!
☝說得好聽,做起來就…
動態規劃 基礎題 數字三角
數字三角形 問題描述 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 上圖給出了乙個數字三角形。從三角形的頂部到底部有很多條不同的路徑。對於每條路 徑,把路徑上面的數加起來可以得到乙個和,和最大的路徑稱為最佳路徑。你的任務就是求 出最佳路徑上的數字之和。輸入資料 輸入的第一行是乙個整數 ...
動態規劃 數字三角形
如圖所示的數字三角形,從頂部出發,在每一結點可以選擇向左走或得向右走,一直走到底層,要求找出一條路徑,使路徑上的值最大。第一行是數塔層數n 1 n 100 第二行起,按數塔圖形,有乙個或多個的整數,表示該層節點的值,共有n行。輸出最大值。5 1311 8 12 7 26 6 14 15 8 12 7...
動態規劃 數字三角形
7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 在上面的數字三角形中尋找一條從頂部到底邊的路徑,使得 路徑上所經過的數字之和最大。路徑上的每一步都只能往左下或 右下走。只需要求出這個最大和即可,不必給出具體路徑。三角形的行數大於1小於等於100,數字為 0 99 5 三角形行數。下面是三...