프로그래머 업그레이드 Daguai 레벨 5 : 로봇이 끝까지 도달하려면 몇 가지 방법이 필요합니까?

안녕하세요, 저는 "@ 不 飞 的 小飞 驴"입니다.

5
로봇이 끝점으로 이동하는 다른 경로 로봇은 mxn 그리드의 왼쪽 상단 모서리에 있습니다 (아래 그림에서 시작점은 "시작"으로 표시됨).
로봇은 한 번에 한 단계 아래로 또는 오른쪽으로 만 이동할 수 있습니다. 로봇은 그리드의 오른쪽 하단 모서리에 도달하려고합니다 (아래 이미지에서 "완료"로 표시됨).
총 몇 개의 경로가 있습니까?

예 1 :
여기에 사진 설명 삽입

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

예 2 :
입력 : m = 3, n = 2
출력 : 3
설명 :
왼쪽 상단 모서리부터 시작하여 오른쪽 하단 모서리까지 총 3 개의 경로가 있습니다.

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

먼저, 좋은 방법이 무엇인지 생각해보세요. 아래 댓글에 오신 것을 환영합니다.

전반적인 사고 :이 질문에 사용 된 주요 아이디어는 동적 프로그래밍 솔루션입니다.
로봇은 오른쪽 아래로만 이동할 수 있고 다른 방향으로는 이동할 수 없습니다. 좌표를 나타 내기 위해 dp [i] [j]를 사용합니다 ( i, j)이 그리드에 얼마나 많은 경로가 있는지, 그래서 최종 답은 dp [m-1] [n-1]을 찾는 것입니다.
위나 왼쪽에서만 올 수 있기 때문에 반복 공식은
dp [i] [j] = dp [i-1] [j] + dp [i] [j-1]입니다.

dp [i-1] [j]는 위에서부터의 경로 수를 나타냅니다.
dp [i] [j-1]은 왼쪽부터의 경로 수를 나타냅니다.
여기에 사진 설명 삽입

따라서 경계 조건은 무엇입니까? Finish가 첫 번째 행의 임의 위치에 하나의 경로 만 있고 같은 방식으로 Finish의 첫 번째 열의 위치에 경로가 하나만있는 경우 경계 조건은 첫 번째 행과 첫 번째 열은 모두 1입니다. 반복 공식과 경계 조건을 찾았으므로 동적 프로그래밍 코드는 다음과 같습니다.
프로그램 :

public int uniquePaths(int m, int n) {
    
    
    int[][] dp = new int[m][n];
    //第一列都是1
    for (int i = 0; i < m; i++) {
    
    
        dp[i][0] = 1;
    }
    //第一行都是1
    for (int i = 0; i < n; i++) {
    
    
        dp[0][i] = 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-1][n-1];
}

추천

출처blog.csdn.net/u014251610/article/details/113747805