https://www.acmicpc.net/problem/20152
20152번: Game Addiction
첫째 줄에 집과 PC방의 좌표 (H, H), (N, N) 을 나타내는 두 정수 H, N (0 ≤ H, N ≤ 30) 이 차례로 주어진다.
www.acmicpc.net
꽤 헷갈렸던 문제였다. 연습이 더 필요한 것 같다.
힌트를 참고하여 풀었는데, 방식은 다음과 같다.
1. 집 -> 피시방, 피시방 -> 집까지 가는 경우의 수를 통일하기 위해 작은 좌표 -> 큰 좌표로 가도록 계산
2. 작은 좌표 -> 큰 좌표로 가는 경우의 수는 bottom up 방식으로 왼쪽, 위쪽에서 오는 경우의 수가 더해짐
정답코드
#include <iostream>
using namespace std;
#define MAX_SIZE 31
int H, N;
long long dp[MAX_SIZE][MAX_SIZE];
int main()
{
cin >> H >> N;
if (H == N) { cout << 1; return 0; }
//작은 좌표 -> 큰 좌표로 통일하기 위함
if (H > N) swap(H, N);
//왼쪽 -> 오른쪽만으로 가는 경우의 수는 1가지
//bottom up을 위함
for (int i = H; i <= N; i++) {
dp[H][i] = 1;
}
for (int i = H + 1; i <= N; i++) {
for (int j = H + 1; j <= N; j++) {
//왼쪽, 위쪽에서 오는 경우의 수 계산
if (i <= j) {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
}
cout << dp[N][N];
return 0;
}
'알고리즘 관련 > BOJ' 카테고리의 다른 글
1719 택배 (0) | 2021.07.05 |
---|---|
15658 연산자 끼워넣기(2) (0) | 2021.06.22 |
1655 가운데를 말해요 (0) | 2021.04.28 |
20922 겹치는 건 싫어 (0) | 2021.04.25 |
17472 다리 만들기 2 (0) | 2021.03.22 |