觀察下面的數字三角形。
在每乙個點,只能走到左下角的乙個點,或者右下角的乙個點。
特別的,三角形中值為-1
的點是不可經過的,請不要經過這些點。
找到一條從最高點到最低點的路徑,使得經過的數字的和最大,輸出這個和,如果沒有這樣的路徑,輸出」impossible」
(輸出不要加雙引號)。 7
3 8
8 1 0
2 7 4 4
4 -1 2 6 5
解題思路:第一思路就是暴力法,通過遍歷三角形的所有路線,對比最終的值就能得出結果。但是效率不高,原因是三角形每多一層,遍歷量則乘以2
,這樣複雜度是o(
2^n),如果是多組資料的話必然會
lte,所以需要使用一種新的方法來改進效率。
這種方法叫做動態規劃。在數字三角形的每乙個節點都有兩個策略,要不是向左走,要不是向右走,一直到最後一步。不妨定義題目給出的數字三角形是a
(i,j
),另乙個數字三角形d(
i,j),其中i與
j表示第
i層的第
j個元素。
對於任意乙個d
(i,j
),它表示當前狀態下走到a(
i,j)節點所有路線中的最大值,也就是說
d事實上是一種狀態。對於
d的計算,給出下列方法:
狀態轉移方程:
這樣,d
(n,j
)(也就是數字三角形的最後一層)將會得到
j個可能的最大值,將這些值求出最大值即可。
重點來了,如何處理-1
這個節點?題目要求是遇到
-1表示不能通過,其實可以通過標記元素來避免這個問題。當a(
i,j)是
-1的時候,將d(
i,j)對應的賦值為
0,這樣該狀態不會被下乙個狀態累加。
**細節:
1.解題思路裡面提到了當a
(i,j
)是-1
的時候,將d(
i,j)對應的賦值為
0,這樣會不會對下乙個狀態有影響?事實上是不會的。原因是題目給出的數字全部是非負數,這意味著數字三角形每過一層都會數值增加,如果將狀態清零,這樣子該狀態到最後一層肯定不是最大值。
2.注意題目還有乙個要求是無法輸出結果的情況,這種情況是當三角形裡面某一層全部是-1
的時候就無法輸出結果。
3.定義二維陣列的下標是從(1,1
)開始的,所以不需要考慮越界的問題。前提是初始化二維陣列為0。
**清單:
NYOJ新生賽 早華寅的財富密碼
input file standard input output file standard output time limit 1 second memory limit 128 megabytes 早隊在睡覺做夢的時候夢到自己發現了乙個藏寶圖,並根據藏寶圖成功找到了寶藏的位置,現在他 在寶藏的入...
題解 ACM2016級新生周賽(11 13)
a 選自2016acm icpc亞洲區域賽 瀋陽站 include int max int x,int y int min int x,int y int main return 0 b 同a題 選自2016acm icpc亞洲區域賽 瀋陽站 include include define maxn ...
ACM2016級新生第三週訓練賽
備用鏈結 題目還是比較基礎,比較簡單。認真補題,學會學習。a 人見人愛a b 題解 求 a的b次方,我們可以用迴圈進行累乘操作,進而計算出次方.因為題目要求只需要求出最後三位,所以每次對 1000 求餘數,最後輸出即可。include include include includeint main ...