OJ 數塔問題

2021-09-14 04:56:04 字數 1450 閱讀 9230

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...