2019/3/31
題目描述:
從數塔頂層出發,每個結點可以選擇向左走或向右走,要求一直走到塔底,使得走過的路徑上的數值和最小。
例如對於下面這樣的數塔
12 3
4 5 6
按照 1 - 2 - 4 的路線走,可取得路徑上的數值和的最小值為 7
輸入描述:
每組輸入的第乙個行表示行數,最大不超過 1000 行。
後面每行為這個數塔特定行包含的正整數。這些正整數不大於 10000。
輸出描述:
對於每組測試資料,輸出一行答案。
樣例輸入:
3
12 3
4 5 6
樣例輸出:
7
csdn首篇部落格獻給oj:數塔問題
這是作者在學校oj**上遇到的一題,由於剛推開計算機的大門未久(或許仍未推開),剛開始所設想的辦法可能過於簡單暴力,而後了解到此題存在乙個動態規劃(dynamic programming)的思想。
動態規劃
通過把原問題分解為相對簡單的子問題的方式求解複雜問題的方法。動態規劃常常適用於有重疊子問題和最優子結構性質的問題。
」分而治之「
思想脈絡:
1.首先我們定義乙個二維陣列,這個二維陣列至少得能開到1000行,則我們需要在main函式外進行全域性陣列定義,才能開大陣列(作者暫時對堆只知概念,後續將進一步了解用堆開大陣列)。
2.對應行列採用金字塔型輸入各元素
3.大方向:」使各節點連成路徑上數值和最小的線「
從下往上進行求解:
某行節點對下一行節點的和需要選取下一行左右位中較小的節點,兩者相加,覆蓋掉前面的某行節點
遞推公式:
t[i][j]+=min(t[i+1][j],t[i+1][j+1])
當運算到最頂層時,頂點選取第二行中較小的乙個相加,即為整個數塔中數值和最小的路徑,數值和將頂點覆蓋,輸出頂點即可。
#include
using namespace std;
int t[
1001][
1001];
intmain()
}//遞推演算法(自底向上運算):
for(
int i = n-
2; i >=
0; i--
)}
cout<[0
]
}
問題 A 數塔
時間限制 1 sec 記憶體限制 128 mb 提交 1311 解決 623 提交 狀態 討論版 給定乙個數塔,如下圖所示。在此數塔中,從頂部出發,在每一節點可以選擇走左下或右下,一直走到底層。請找出一條路徑,使路徑上的數值和最大。9 12 15 10 6 8 2 18 9 5 19 7 10 4 ...
OJ漢諾塔問題
題目 如圖所示的三根針,其中a針上穿好了由大到小的64片金片,不論白天黑夜,總有乙個和尚在按照下面的法則移動金片 一次只移動一片,不管在哪根針上,小片必須在大片上面。和尚們預言,當所有的金片都從a針移到c針上時,世界就將在一聲霹靂中消失,這就是所謂的漢諾塔。請程式設計求出將a針上所有金片移到c上的步...
數塔取數問題
1002 數塔取數問題 乙個高度為n的由正整數組成的三角形,從上走到下,求經過的數字和的最大值。每次只能走到下一層相鄰的數上,例如從第3層的6向下走,只能走到第4層的2或9上。5 8 4 3 6 9 7 2 9 5 例子中的最優方案是 5 8 6 9 28 input 第1行 n,n為數塔的高度。2...