華師ACM新生賽1005

2021-06-27 10:51:08 字數 1257 閱讀 6475

觀察下面的數字三角形。

在每乙個點,只能走到左下角的乙個點,或者右下角的乙個點。

特別的,三角形中值為-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 ...