안녕하세요, 저는 "@ 不 飞 的 小飞 驴"입니다.
5
로봇이 끝점으로 이동하는 다른 경로 로봇은 mxn 그리드의 왼쪽 상단 모서리에 있습니다 (아래 그림에서 시작점은 "시작"으로 표시됨).
로봇은 한 번에 한 단계 아래로 또는 오른쪽으로 만 이동할 수 있습니다. 로봇은 그리드의 오른쪽 하단 모서리에 도달하려고합니다 (아래 이미지에서 "완료"로 표시됨).
총 몇 개의 경로가 있습니까?
예 1 :
입력 : m = 3, n = 7
출력 : 28
예 2 :
입력 : m = 3, n = 2
출력 : 3
설명 :
왼쪽 상단 모서리부터 시작하여 오른쪽 하단 모서리까지 총 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];
}