프로 62 다른 경로
주제 설명 :
m × n에 그리드의 왼쪽 상단 모서리에있는 로봇
로봇은 오른쪽이나 아래로 한 단계를 이동할 수 있습니다. 로봇은 그리드의 오른쪽 하단에 도달하려고합니다
Q. 총에 얼마나 많은 서로 다른 경로?
문제 해결 아이디어 :
1.
이것은 가장 명백한 자기 결합 배치는, 내려가 단계의 수는 고정되고 오른쪽 왼쪽 및 오른쪽 하단에서 온이되도록 선택된 N (m-1) + (N -1) 단계 (오른쪽 동일하게 m-1 단계로서 선택 될 수있다) -1 문제의 조합의 하부 데크 향해 이동. 따라서, 서로 다른 경로의 총 수 .
다음과 같이 코드입니다 :
// 치환 방법은 단계 떠나는 m + N-2의 합계로서 이해 될 수 있고, m-1 선택 하부 데크를 향해 이동하는 상기 //가 오버플로 할 때 m, n은 크게 발생할 더블 사용, 공적 INT (uniquePaths를 INT의 m을 INT N-) { 더블 결과 계승 = (N-m-2 + ,.)로 -N- 1 / 계승 (m-1,0 ) // 에서 System.out.println (결과), 창 ( INT ) 결과; } // 계승 기능 공공 더블 계승 ( INT 시작 INT의 끝) { 더블 RES의 = 1. , 대한 ( 더블 I = 시작; I> 끝; 난 - ) { RES입술 * = I; } 반환 입술을; }
2.
제 아이디어는 모든 위치에서 그 점은 상기 다운 단계를 취하거나, 오른쪽으로 한 단계 더 나아가 좌측 포인트 동적 프로그래밍 알고리즘이다. 첫 번째 열의 첫 번째 라인과 모든 점에 도달하는 하나의 경로가 있습니다.
모두는 다음을 달성하기 위해 :
// n 행과 m 열, 즉 m * n 개의 격자 // 모든 경로 위치에 와서는 [I] [J]를 위치 전체 경로 같다 [I-1] [J]를 더한 위치 [I] [J-1] 모든 경로 공개 INT uniquePaths1 ( INT m, INT N-) { INT [] [] = 경로 새로운 새 INT [N- [m]; // 첫 번째 행 에 대한 ( INT , I은 m이 <; I = 0 I가 ++) 경로 [ 0] [I] = 1이다. ] // 첫 번째 열 을위한 ( INT J = 0; J <N-, J ++) 경로 [J] [0] = 1이다. ] 대 ( INT I = 1]. I은 m이 <; I는 ++ ) { 대 ( INT . J <N-; J ++ J = 1 ) { 경로 [J] [I] = 경로 [J] [I-1] + 경로 [J-1 ] [I]; } } 리턴 경로 [N-1] [m-1 ]; }
Pro63. 다른 경로 ||
주제 설명 :
(62) 및 이와 유사한 질문, 그냥 그리드에서 더 많은 장애물을 지불합니다. 입력 격자, 장애물 및 빈 격자의 위치를 각각 나타내는 이차원 배열 1
하고 0
표시한다.
이제 그리드 장애물을 고려하십시오. 그래서 얼마나 많은 서로 다른 경로 왼쪽 상단에서 오른쪽 하단에있을 것인가?
문제 해결 아이디어 :
위치는 장애의 경우 장애물의 경우, 포인트가 0으로 설정된 모든 점에 도달하는 경로의 수에 도달 할 수 없습니다. 배리어위한 눈금이 존재하는 경우, 첫 번째 행과 첫 번째 열의 초기화 동안, 다음 표의 오른쪽 / 바닥 도달한다.
코드 구현 :
공개 INT uniquePathsWithObstacles ( INT [] [] obstacleGrid) { // 若数组为空 경우 (obstacleGrid.length == 0) 복귀 0 ; INT LEN = obstacleGrid.length; INT는 = obstacleGrid [0 떨어 졌 ] .length 단계; INT [] [] = 경로 새로운 INT [LEN] 떨어 졌]; // 第一列 대 ( int로 I = 0; I <렌; 내가 ++ ) { 경우 (obstacleGrid [I] [0] == 1) 파괴 ; 경로 [I]이 [ 0] = 1 ; } //첫 번째 행 에 대한 ( INT J = 0; J <WID; J ++ ) { IF (obstacleGrid [0] [J] == 1). BREAK , 경로 [ . 0] [J] = 1 ; } 대 ( INT I = 1이다.; I 렌 <; I는 ++ ) { 대 ( INT J = 1]. J <WID; J ++ ) { // 장애의 포인트, 포인트는 경로의 개수가 0에 도달하면 IF . (obstacleGrid [I] [J] == 1 ) 경로 [I] [J] = 0 ; 다른 { 경로 [I] [J] = 경로 [I-1.] [J] + 경로 [I] [J- 1이다. ]; } } } 리턴 경로 [렌-1] [WID-1 ]; }