Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- 시뮬레이션
- swea
- mst
- 수학
- 알고리즘
- 세그먼트 트리
- Network
- 문자열
- 유니온 파인드
- Kotlin
- 위상정렬
- 프로그래머스
- 후니의 쉽게 쓴 시스코 네트워킹
- dfs
- 투 포인터
- JUnit 5
- 이분탐색
- java
- 플로이드-와샬
- 에라토스테네스의 체
- CS
- BFS
- Effective Java
- 완전탐색
- 그리디
- 백트래킹
- 구현
- 백준
- 동적계획법
- 스택
Archives
반갑습니다!
[백준] 10164 격자상의 경로 본문
풀이
등굣길문제와 유사하게 해결하였다. 출발지에서 꼭 들려야하는 지점까지 가는 방법의 수와 꼭 들려야하는 곳에서 N X M 번재 지점까지 가는 방법의 수를 구해서 곱해주면 모든 경로의 개수가 된다.
코드
C++
#include <iostream>
#include <vector>
using namespace std;
int n, m, k, r, c;
vector<vector<int>> dp1, dp2;
int main() {
cin >> n >> m >> k;
dp1 = vector<vector<int>>(n, vector<int>(m, 1));
dp2 = vector<vector<int>>(n, vector<int>(m, 1));
if (k == 0) {
r = n - 1;
c = m - 1;
}
else {
if (k % m == 0) r = k / m - 1;
else r = k / m;
c = k - 1 - m * r;
}
for (int i = 1; i <= r; i++)
for (int j = 1; j <= c; j++)
dp1[i][j] = dp1[i - 1][j] + dp1[i][j - 1];
for (int i = r + 1; i < n; i++)
for (int j = c + 1; j < m; j++)
dp2[i][j] = dp2[i - 1][j] + dp2[i][j - 1];
cout << dp1[r][c] * dp2[n - 1][m - 1] << '\n';
return 0;
}
Kotlin
fun main() {
val (n, m, k) = readLine()!!.split(" ").map { it.toInt() }
val dp1 = Array(n) { Array(m) { 1 } }
val dp2 = Array(n) { Array(m) { 1 } }
val r: Int
val c: Int
if (k == 0) {
r = n - 1
c = m - 1
} else {
r = if (k % m == 0) k / m - 1 else k / m
c = k - 1 - r * m
}
for (j in 1..c)
for (i in 1..r)
dp1[i][j] = dp1[i][j - 1] + dp1[i - 1][j]
for (j in c + 1 until m)
for (i in r + 1 until n)
dp2[i][j] = dp2[i][j - 1] + dp2[i - 1][j]
println(dp1[r][c] * dp2[n - 1][m - 1])
}
'알고리즘 문제 풀이' 카테고리의 다른 글
[프로그래머스] 수식 최대화 (0) | 2020.07.06 |
---|---|
[프로그래머스] 키패드 누르기 (0) | 2020.07.05 |
[백준] 9507 Generations of Tribbles (0) | 2020.06.21 |
[백준] 2630 색종이 만들기 (0) | 2020.06.08 |
[백준] 1735 분수 합 (0) | 2020.06.04 |