藍橋杯 數字三角形之Python解答

2021-10-10 08:19:46 字數 3626 閱讀 4584

數字三角形 的題目分原題(題目一)和變種(題目二),這裡將兩個題目都記在下面。

問題描述:

下圖是乙個數字三角形。 請編乙個程式計算從頂至底的某處的一條路徑,使該路徑所經過的數字的總和最大。

●每一步可沿左斜線向下或右斜線向下走;

●1<三角形行數≤100;

●三角形中的數字為整數0,1,…99;

輸入格式:

檔案中首先讀到的是三角形的行數n。

接下來n行描述整個三角形

輸出格式:

最大總和(整數)

樣例輸入:57

3 88 1 0

2 7 4 4

4 5 2 6 5

樣例輸出:

30這道題需要運用動態規劃來進行解答,tril[ i ] [ j ]的值與其肩上兩個數值(tril[ i -1] [ j -1]、tril[ i-1 ] [ j ])緊密相關,對每個tril[ i ][ j ],其值應為:tril[ i ][ j ]=tril[ i ][ j ]+max(tril[ i -1] [ j -1]+tril[ i-1 ] [ j ]),經過路徑的最大總和,可以從上往下計算,也可以從下往上計算,其中從下往上計算,**遍歷的次數要少些。這裡把兩種**附上:

從下往上:

n=

int(

input()

)tril=

for i in

range

(n):

list

(map

(int

,input()

.split())

))sum=

0for i in

range

(n-2,-

1,-1

):for j in

range

(i+1

):

tril[i]

[j]=tril[i]

[j]+

max(tril[i+1]

[j],tril[i+1]

[j+1])

if tril[i]

[j]>sum:

sum=tril[i]

[j]print

(sum)

遍歷後再輸出tril列表,結果如下:

可知最後一行資料其實是未被改動的。

從上往下:

n=

int(

input()

)tril=

for i in

range

(n):

list

(map

(int

,input()

.split())

))sum=

0for i in

range

(n):

for j in

range

(i+1):

if i==0:

continue

if j==0:

tril[i]

[j]=tril[i]

[j]+tril[i-1]

[0]elif j==i:

tril[i]

[j]=tril[i]

[j]+tril[i-1]

[j-1

]else

: tril[i]

[j]=tril[i]

[j]+

max(tril[i-1]

[j-1

],tril[i-1]

[j])

print

(max

(tril[-1]))

遍歷後再輸出tril列表,結果如下:

2023年10月份的第十一屆藍橋杯省賽(第二場)也有道與之類似的題目,但題目多了條限制,即「向左下走的次數與向右下走的次數相差不能超過 1」。

這裡把完整的題目附上。

問題描述:

上圖給出了乙個數字三角形。從三角形的頂部到底部有很多條不同的路徑。

對於每條路徑,把路徑上面的數加起來可以得到乙個和,你的任務就是找到最大的和。

路徑上的每一步只能從乙個數走到下一層和它最近的左邊的那個數或者右邊的那個數。此外,向左下走的次數與向右下走的次數相差不能超過 1。

輸入格式:

輸入的第一行包含乙個整數 n (1 < n ≤ 100),表示三角形的行數。下面的n 行給出數字三角形。數字三角形上的數都是 0 至 100 之間的整數。

輸出格式:

輸出乙個整數,表示答案。

樣例輸入:57

3 88 1 0

2 7 4 4

4 5 2 6 5

樣例輸出:

27開始的時候不知道如何對這個問題進行解答,後來在一篇部落格裡看到了作者的**,作者的前面解題思路與上面所述的是一樣的,即運用了動態規劃,但在輸出時進行了判斷,按作者的思路,寫出的**如下:

n=

int(

input()

)tril=

for i in

range

(n):

list

(map

(int

,input()

.split())

))sum=

0for i in

range

(n):

for j in

range

(i+1):

if i==0:

continue

if j==0:

tril[i]

[j]=tril[i]

[j]+tril[i-1]

[0]elif j==i:

tril[i]

[j]=tril[i]

[j]+tril[i-1]

[j-1

]else

: tril[i]

[j]=tril[i]

[j]+

max(tril[i-1]

[j-1

],tril[i-1]

[j])

lth=

len(tril[-1

])if lth%2==

0:print

(tril[-1

][lth//2-

1])else

:print

(tril[-1

][lth//2]

)

由於題目要求「向左下走的次數與向右下走的次數相差不能超過 1」,因而儲存最大和的元素絕不是最後一行的第乙個和最後乙個元素,但為何要取最後一行中間的元素 i ,以及為何當最後一行元素個數為偶數時,取 i-1 而不取 i+1,這個問題還沒弄明白,先記在這裡。

python藍橋杯數字三角形

回溯法求數字三角形 從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到乙個和,你的任務就是找到最 大的和。路徑上的每一步只能從乙個數走到下一層和它最近的左邊的那個數或者右邊的那個數。此外,向左下走的次數與向右下走的次數相差不能超過 1。輸入格式 輸入的第一行包含乙個整...

藍橋杯 數字三角形

題目大意 編寫程式計算從三角形頂部到底部的某處的一條路徑,使得該路徑所經過的數字的總和最大。每一步可沿左斜線向下或右斜線向下走 1 三角形行數 100 三角形中的數字為整數0,1,99 題目分析 很好的一道動態規劃的例子。解題思路是自底向上分析,既然這條路徑能從頂部到底部,那麼從下往上看,也是等效的...

藍橋杯 數字三角形

問題描述 圖 示出了乙個數字三角形。請編乙個程式計算從頂至底的某處的一條路 徑,使該路徑所經過的數字的總和最大。每一步可沿左斜線向下或右斜線向下走 1 三角形行數 100 三角形中的數字為整數0,1,99 輸入格式 檔案中首先讀到的是三角形的行數。接下來描述整個三角形 輸出格式 最大總和 整數 樣例...