이 문제는 간단한 동적 계획법을 이용하여 풀 수 있다.
어떤 동적계획법이든 마찬가지지만 시간초과가 제일 문제이다.
일단 이 문제는 확률과통계에서 나오는 조합을 이용하여 풀 수 있다.
eCr = e-1Cw-1 + e-1Cw (e = east, w = west) 공식을 이용하여 풀면 된다.
eC0 = 1일 때와 e==w일 때를 출구조건으로 하면 간단하게 풀 수 있다.
(memoization을 이용하지 않으면 시간초과가 뜨므로 주의한다.)
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 | #include <iostream> #include <cstdio> #pragma warning(disable : 4996) using namespace std; unsigned long long result[30][30]; unsigned long long combination(int east, int west) { if (east == west || west == 0) return result[east][west] = 1; if (result[east][west] > 0) return result[east][west]; else return result[east][west] = combination(east - 1, west - 1) + combination(east - 1, west); } int main() { int N; int west, east; cin >> N; for (int i = 0; i < N; i++) { cin >> west >> east; cout << combination(east, west) << endl; } return 0; } | cs |
'Algorithm Problems > BOJ' 카테고리의 다른 글
[13699번] 점화식 - Dynamic Programming 동적계획법[C++] (0) | 2017.02.20 |
---|---|
[11726번] 2xn 타일링 - Dynamic Programming 동적계획법[C++] (0) | 2017.02.20 |
[1730번] 판화 - 비트마스크, 배열[C++] (0) | 2017.02.13 |
[11657번] Time Machine 타임머신 - Bellman-Ford Algorithm[C++]☆ (0) | 2017.01.17 |
[9935번] String Explosion 문자열 폭발 - Stack[C++] ☆ (0) | 2017.01.03 |