ブルーブリッジカップテストの質問:デジタルトライアングル

デジタルトライアングル

問題の説明

高さがnの「デジタル三角形」が与えられると、i番目の行にi個の番号があります(1 <= i <= n)。
最初は、最初の行の唯一の番号である「デジタル三角形」の上部に立っています。移動するたびに、現在の位置の真下または現在の位置の右下に移動することを選択できます。つまり、(i、j)にいる場合(以下と同じように、i番目の行のj番目の数字を左から右に数えることを示します)、(i + 1、j)または(i + 1、j)に移動することを選択できます。 +1)。
通過するすべての位置(開始点と終了点を含む)の合計を最大化する必要があります。この最大値を見つけます。

入力フォーマット

最初の行の正の整数nは、デジタル三角形のサイズを表します。

2行目からn + 1行目まで、i + 1行目はスペース区切られた負でない整数であり、デジタル三角形のi番目の線を表します。

出力フォーマット

1行あたりの整数は、パス上の数値の最大合計を表します。

サンプル入力

4

1

2 3

4 5 6

7 8 9 10

サンプル出力

20

説明例

右に歩き続けてください。

方法1の
アイデア:

この質問では再帰形式を使用できます。各レイヤーの左右を取り出してサイズを判断し、レベル番号の合計に大きな数値を追加できます。それぞれの結果を記憶するために2次元配列を作成できます。maxSum [r + 1] [j] ==-1の場合この判断は、繰り返される計算を差し引くために使用されます。

a=int(input())
dp=[]
for i in range(a):
   dp.append(list(map(int,input().split())))
maxSum=[[-1 for i in range(a)]for i in range(a)]
def ma(r,j):
   if r==a-1:
       return dp[r][j]
   if maxSum[r+1][j]==-1:   #如果MaxSum(r+1,j)没有计算过,计算后保存 
       maxSum[r+1][j]=ma(r+1,j);
   if maxSum[r+1][j+1]==-1:   #如果MaxSum(r+1,j+1)没有计算过,计算后保存 
       maxSum[r+1][j+1]=ma(r+1,j+1);
   if maxSum[r+1][j]>maxSum[r+1][j+1]:
       return maxSum[r+1][j]+dp[r][j];
   return maxSum[r+1][j+1]+dp[r][j];

print(ma(0,0))

方法2の
アイデア

次のコードは動的プログラミングの形式で入力されます。再帰的な方法を使用して下から最初に移動しました。このプログラムの転送式はq [i-1] [i1] + = max(q [i ] [i1]、q [i] [i1 + 1])、最下層が上司に最大2つの結果を継続的に取得するようにします。したがって、最良の値はq [0] [0]に移動することです。

a=int(input())
q=[]
q1=[[0 for i1 in range(i)] for i in range(1,a)]
for i in range(a):
    q.append(list(map(int,input().split())))

for i in range(a-1,0,-1):
    for i1 in range(i):
        q[i-1][i1]+=max(q[i][i1],q[i][i1+1])
print(q[0][0])

転載は禁止されています。自習のみ。プログラムエラーについては責任を負いません。

おすすめ

転載: blog.csdn.net/weixin_46640345/article/details/112426502
おすすめ