アリババと40人の泥棒


作成日:2022年2月24日午後3:26

インプリメンテーションコード

# 알리바바와 40인의 도둑(Bottom-Up)
import sys
sys.stdin = open("input.txt", "rt")

n = int(input())
board = []
for _ in range(n):
    board.append(list(map(int, input().split())))

dy = [[0 for _ in range(n)] for _ in range(n)]

for i in range(0, n):
    for j in range(0, n):
        if 0<=i-1<n or 0<=j-1<n:
            if 0<=i-1<n and 0<=j-1<n:
                top = dy[i-1][j]
                left = dy[i][j-1]
                if top <= left:
                    dy[i][j] = top + board[i][j]
                else:
                    dy[i][j] = left + board[i][j]
            elif 0<=i-1<n:
                top = dy[i-1][j]
                dy[i][j] = top + board[i][j]
            else:
                left = dy[i][j-1]
                dy[i][j] = left + board[i][j]
        else:
            dy[i][j] = board[i][j]

print(dy[n-1][n-1])

模範解答

import sys
sys.stdin = open("input.txt", 'r')    
if __name__=="__main__":
    n=int(input())
    arr=[list(map(int, input().split())) for _ in range(n)]
    dy=[[0]*n for _ in range(n)]
    dy[0][0]=arr[0][0]
    for i in range(1, n):
        dy[0][i]=dy[0][i-1]+arr[0][i]
        dy[i][0]=dy[i-1][0]+arr[i][0]
    for i in range(1, n):
        for j in range(1, n):
            dy[i][j]=min(dy[i-1][j], dy[i][j-1])+arr[i][j]
    print(dy[n-1][n-1])

差異

  • の基本論理は同じである.
  • 各格は複文で回転し、自分の上下と左側を比較し、dyに小さな値と自分の値を加える.
  • の模範解答では,まず0行目と10列目をすべてdyに記入する.△これで私のように条件文を書く必要はありません.