[동적 프로그래밍 질문 3] 다른 경로&& 다른 경로 II

다른 경로

62. 다른 길

로봇은 mxn 그리드의 왼쪽 상단에 있습니다(아래 이미지에서 시작점은 "시작"으로 표시됨).
로봇은 한 번에 한 단계 아래로 또는 오른쪽으로만 이동할 수 있습니다. 로봇은 그리드의 오른쪽 하단 모서리에 도달하려고 시도합니다(아래 이미지에서 "완료"라고 표시됨).
총 몇 개의 서로 다른 경로가 있습니까?
여기에 이미지 설명을 삽입하세요.
입력: m = 3, n = 7
출력: 28

예제 2:
입력: m = 3, n = 2
출력: 3
설명:
왼쪽 상단에서 시작하여 오른쪽 하단에 도달하는 경로는 총 3개입니다.

  1. 오른쪽 -> 아래 -> 아래
  2. 아래->아래->오른쪽
  3. 아래->오른쪽->아래

예시 3:
입력: m = 7, n = 3
출력: 28

예시 4:
입력: m = 3, n = 3
출력: 6

1. 상태 표현

dp[i][j]는 [i][j] 위치에 도달할 때의 모든 경로 수를 나타냅니다.

2. 상태 전이 방정식

동적 프로그래밍 문제의 경우 경험과 문제 분석을 통해 상태 전이 방정식을 추측하는 방법을 배워야 합니다.
[i][j] 위치에 도달하면 질문의 의미에 따라 두 가지 상황이 있습니다.

  1. 위치 [i-1][j]에서 [i][j]로 한 단계 위로 이동합니다.
  2. 위치 [i][j-1]에서 [i][j]까지 오른쪽으로 한 단계 이동합니다.

따라서 dp[i]의 값은 두 경우의 합입니다.

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

3. 초기화
재귀 수식에서 알 수 있듯이 dp[0][j] 행과 dp[i][0] 열을 초기화해야 하는데, 초기화가 더 번거롭기 때문에 dp[0][를 초기화하면 됩니다
. j] this 이 단계에서는 하나의 행과 열 dp[i][0]이 양식에 추가됩니다.

초기화하는 데 도움이 되도록 전면에 "보조 노드"를 추가할 수 있습니다. 이 기술을 사용할 때 주의해야 할 두 가지 사항이 있습니다.

  1. i. 보조 노드의 값은 "후속 양식 작성이 올바른지 확인"해야 합니다.
  2. ii. "첨자의 매핑 관계".

이 질문에서는 "행 추가"와 "열 추가" 후에 dp[0][1]의 위치를 ​​1로 초기화하기만 하면 됩니다.
여기에 이미지 설명을 삽입하세요.

4.
양식 작성 순서 양식 작성 순서는 각 행을 작성할 때 "위에서 아래로", "왼쪽에서 오른쪽으로" 각 행을 채우는 것입니다.

5. 반환값
dp[m][n]의 값을 반환해야 합니다.

암호:

  int uniquePaths(int m, int n) {
    
    
        vector<vector<int>> dp(m+1,vector<int>(n+1));
        dp[0][1]=1;
        for(int i=1;i<=m;i++)
        {
    
    
            for(int j=1;j<=n;j++)
            {
    
    
                dp[i][j]=dp[i-1][j]+dp[i][j-1];
            }
        }
        return dp[m][n];
    }

여기에 이미지 설명을 삽입하세요.

다양한 경로 II

63. Different paths II
로봇은 mxn 그리드의 왼쪽 상단에 위치해 있습니다(아래 이미지에서 시작점은 "Start"로 표시되어 있습니다).
로봇은 한 번에 한 단계 아래로 또는 오른쪽으로만 이동할 수 있습니다. 로봇은 그리드의 오른쪽 하단 모서리에 도달하려고 시도합니다(아래 이미지에서 "완료"라고 표시됨).
이제 그리드에 장애물이 있다고 생각해보세요. 그러면 왼쪽 위 모서리에서 오른쪽 아래 모서리까지 몇 개의 다른 경로가 있습니까?
그리드의 장애물과 빈 위치는 각각 1과 0으로 표시됩니다.

여기에 이미지 설명을 삽입하세요.
입력: 장애물 그리드 = [[0,0,0],[0,1,0],[0,0,0]]
출력: 2
설명: 3x3 그리드 중앙에 장애물이 있습니다.
왼쪽 상단에서 오른쪽 하단으로 가는 경로는 2가지가 있습니다.

  1. 오른쪽->오른쪽->아래쪽->아래쪽
  2. 아래->아래->오른쪽->오른쪽

1. 상태 표현

dp[i][j]는 [i][j] 위치에 도달할 때의 모든 경로 수를 나타냅니다.

2. 상태 전이 방정식

동적 프로그래밍 문제의 경우 경험과 문제 분석을 통해 상태 전이 방정식을 추측하는 방법을 배워야 합니다.
[i][j] 위치에 도달하면 질문의 의미에 따라 두 가지 상황이 있습니다.

  1. 위치 [i-1][j]에서 [i][j]로 한 단계 위로 이동합니다.
  2. 위치 [i][j-1]에서 [i][j]까지 오른쪽으로 한 단계 이동합니다.

그런데 [2][3]에 장애물이 있는 것처럼 특정 위치에 장애물이 있을 경우에는 [2][3]에서 [3][3]이나 [2][4]로 갈 수 없고, 따라서 dp[2][3]의 값은 0입니다.

따라서 dp[i]의 값은 0이고:

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

3. 초기화
재귀 수식에서 알 수 있듯이 dp[0][j] 행과 dp[i][0] 열을 초기화해야 하는데, 초기화가 더 번거롭기 때문에 dp[0][를 초기화하면 됩니다
. j] this 이 단계에서는 하나의 행과 열 dp[i][0]이 양식에 추가됩니다.

초기화하는 데 도움이 되도록 전면에 "보조 노드"를 추가할 수 있습니다. 이 기술을 사용할 때 주의해야 할 두 가지 사항이 있습니다.

  1. i. 보조 노드의 값은 "후속 양식 작성이 올바른지 확인"해야 합니다.
  2. ii. "첨자의 매핑 관계".

이 질문에서는 "행 추가"와 "열 추가" 후에 dp[0][1]의 위치를 ​​1로 초기화하기만 하면 됩니다.
여기에 이미지 설명을 삽입하세요.

4.
양식 작성 순서 양식 작성 순서는 각 행을 작성할 때 "위에서 아래로", "왼쪽에서 오른쪽으로" 각 행을 채우는 것입니다.

5. 반환값
dp[m][n]의 값을 반환해야 합니다.

암호:

 int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
    
    
        int m=obstacleGrid.size();
        int n=obstacleGrid[0].size();
          
        vector<vector<int>> dp(m+1,vector<int>(n+1));
         dp[0][1]=1;
        for(int i=1;i<=m;i++)
        {
    
    
            for(int j=1;j<=n;j++)
            {
    
    
                if(obstacleGrid[i-1][j-1]==1) dp[i][j]=0;
                else dp[i][j]=dp[i-1][j]+dp[i][j-1];
            }
        }
        return dp[m][n];
    }

여기에 이미지 설명을 삽입하세요.

추천

출처blog.csdn.net/m0_64579278/article/details/132005648