[プログラマー]コース建設複記

13345 ワード

質問する


https://programmers.co.kr/learn/courses/30/lessons/67259

さまよう過程


まず最初はdfsで解決した.何が問題なのか分かりませんが、24番のテストケースは返されませんでした.
一般的なdpとは異なり,以前の決定は次のステップにも影響を及ぼす.
100と120の2つの値が(1,1)ノードに入ると仮定すると、通常のdpであれば、最小値100が格納される.ただし、最小値100を記憶して方向を変えると、次の隣接座標は150となる.しかし、120を保存した後に方向を変えなければ、130の最小値が発生する可能性があるが、これを考慮することはできない.
では、すべての方向を考えるべきです.この過程で長い間うろうろしていた.

考慮すべき

  • の最初の開始を考慮すべきである.(0,0)点で歩ける座標は(1,0)と(0,1)で、どちらの場合も料金は100です.1つの方向のみを追加すると、2つの座標のうちの1つの座標に500の値が格納されます.そのため、高すぎる費用が貯まり、他の方向を考慮することはできません.では、両方の方向をqueueに同時に格納するとどうなるのでしょうか.正解ではありませんが、確かになぜか分かりません.
  • code

    # 자동차 경주로 건설 N*N
    # 0은 빈칸, 1은 채워져있다
    # 직선도로 100원, 코너 500원
    
    # dfs
    
    
    
    
    def solution(board):
        answer = 0
        dxy = [[0,1],[0,-1],[1,0],[-1,0]]
        visited = [[False]*len(board[0]) for _ in range(len(board))]
        res = float("inf")
        
        memo = [[float("inf")]*len(board[0]) for _ in range(len(board))]
        
        def dfs(x,y,direct,pay):
            nonlocal res
            
            if pay> res:
                return
            
            if pay <= memo[x][y]: ##### 다시보기
                memo[x][y] = pay
            else:
                return
            
            if x == len(board)-1 and y == len(board[0])-1:
                return
    
            for k in range(4):
                nx, ny = x+dxy[k][0], y +dxy[k][1]
                if 0<= nx < len(board) and 0<=ny<len(board[0]):
                    if not visited[nx][ny] and board[nx][ny] == 0:
                        visited[nx][ny] = True
                        if k != direct:
                            dfs(nx,ny,k, pay+600)
                        else:
                            dfs(nx,ny,k, pay+100)
                        visited[nx][ny] = False
            return
    
        
        
         
        for i in range(4):
            nx, ny = dxy[i][0], dxy[i][1]
            if 0<= nx < len(board) and 0<=ny<len(board[0]):
                if board[nx][ny] == 0:
                    visited[nx][ny] = True
                    print(memo)
                    dfs(nx,ny,i,100)
                    
        
        
        return memo[len(board)-1][len(board)-1]