第十一屆藍橋杯python組第二場省賽 數字三角形

2021-10-22 14:33:13 字數 1687 閱讀 5742

1. 問題描述:

上圖給出了乙個數字三角形。從三角形的頂部到底部有很多條不同的路徑。 對於每條路徑,把路徑上面的數加起來可以得到乙個和,你的任務就是找到最大的和。 路徑上的每一步只能從乙個數走到下一層和它最近的左邊的那個數或者右邊的那個數。此外,向左下走的次數與向右下走的次數相差不能超過1。

【輸入格式】

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

數字三角形上的數都是 0 至 100 之間的整數。

【輸出格式】

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

【樣例輸入】57

3 88 1 0

2 7 4 4

4 5 2 6 5

【樣例輸出】

272. 思路分析:

分析題目可以知道這道題目與之前常規的數字三角形題目是類似的,只是這道題目多了乙個限制條件就是在向左下與右下走的次數相差是不能夠超過1的,其實這道題目解題得到關鍵點也在這裡,後面看了一些網上的思路然後自己畫幾個簡單的例子嘗試能夠走的路徑,最終可以發現答案與我們輸入的n的奇偶性是有關的,當輸入的n為奇數的時候,最終的答案是dp[n - 1][n // 2],為偶數的時候時候為max(dp[n - 1][n // 2 - 1], dp[n - 1][n // 2]),也就是最中間兩個值中的較大值,下面n分別是偶數與奇數的時候可以走的路徑(圖中的數字表示是第幾個的數字),可以發現最終答案是在原來的數字三角形得到的dp陣列中最後一行的中間位置dp值。所以根據題目的限制條件可以走的路徑就變得有限了。所以有的時候還要根據題目的條件多畫畫圖找找突破口在**,畫出簡單例子的圖之後那麼就可以找到某些規律

3. **如下:

if __name__ == '__main__':

n = int(input())

matrix = list()

for i in range(n):

# 使用map函式將輸入的字串中的數字轉為int型別, 最終使用list方法將其轉換為乙個列表

dp = [[0] * n for i in range(n)]

dp[0][0] = matrix[0][0]

for i in range(1, n):

for j in range(i + 1):

# 第一列

if j == 0:

dp[i][j] = dp[i - 1][j] + matrix[i][j]

# 最後一列

elif j == i:

dp[i][j] = dp[i - 1][j - 1] + matrix[i][j]

else:

dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) + matrix[i][j]

# print(dp)

# 最後判斷n是奇數還是偶數來返回對應的值

# 奇數肯定是最中間的那個值偶數肯定是中間兩個較大值

print(dp[n - 1][n // 2] if n % 2 == 1 else max(dp[n - 1][n // 2 - 1], dp[n - 1][n // 2]))

第十一屆藍橋杯

問題描述 小藍要為一條街的住戶製作門牌號。這條街一共有 2020 位住戶,門牌號從 1 到 2020 編號。小藍製作門牌的方法是先製作 0 到 9 這幾個數字字元,最後根據需要將字 符貼上到門牌上,例如門牌 1017 需要依次貼上字元 1 0 1 7,即需要 1 個 字元 0,2 個字元 1,1 個...

第十一屆藍橋杯 矩陣

問題描述 把 1 2020 放在 2 1010 的矩陣裡。要求同一行中右邊的比左邊大,同一列中下邊的比上邊的大。一共有多少種方案?答案很大,你只需要給出方案數除以 2020 的餘數即可。答案提交 這是一道結果填空題,你只需要算出結果後提交即可。本題的結果為乙個整數,在提交答案時只填寫這個整數,填寫多...

第十一屆藍橋杯 走方格

問題描述 在平面上有一些二維的點陣。這些點的編號就像二維陣列的編號一樣。從上到下依次為第 1 至第 n 行,從左到右依次為第 1 至第 m 列,每乙個點可以用行號和列號來表示。現在有個人站在第 1 行第 1 列,要走到第 n 行第 m 列。只能向右或者向下走。注意,如果行號和列號都是偶數,不能走入這...