반응형
https://www.acmicpc.net/problem/9184
9184번: 신나는 함수 실행
입력은 세 정수 a, b, c로 이루어져 있으며, 한 줄에 하나씩 주어진다. 입력의 마지막은 -1 -1 -1로 나타내며, 세 정수가 모두 -1인 경우는 입력의 마지막을 제외하면 없다.
www.acmicpc.net
- 문제
주어진 재귀함수를 그대로 만들면 어마어마한 실행시간이 필요하기에, 실행시간을 줄일 방법을 찾는 문제다.
- 해설
메모이제이션이라는 것을 이용하면 된다. 매개변수 값이 (1,1)인 재귀함수에 한 번 접했더라도, 이 값을 저장하지 않으면 다른 경우에 또 (1,1)을 접하면 또 들어오게 된다.
하지만, 메모이제이션을 이용하면 (1,1)을 접했을 때 이 값을 저장하게 되어서 다음에 또 접하게 될때 굳이 재귀함수를 이용해서 값을 구할 필요가 없어지기에 실행시간이 어마어마하게 단축된다.
- 풀이
#include <iostream>
using namespace std;
int store[21][21][21];
// 메모이제이션이 매우 중요했었음, 이거 안하면 아예 50 50 50입력받으면 렉 걸리면서 실행 안될정도로 dfs를 많이함, 메모이제이션!!!!!
int dfs(int a, int b, int c)
{
if (a <= 0 || b <= 0 || c <= 0)
return 1;
else if (a > 20 || b > 20 || c > 20)
return dfs(20, 20, 20);
else if (store[a][b][c])
return store[a][b][c];
else if (a < b && b < c)
{
store[a][b][c] = dfs(a, b, c - 1) + dfs(a, b - 1, c - 1) - dfs(a, b - 1, c);
return store[a][b][c];
}
else
{
store[a][b][c] = dfs(a - 1, b, c) + dfs(a - 1, b - 1, c) + dfs(a - 1, b, c - 1) - dfs(a - 1, b - 1, c - 1);
return store[a][b][c];
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int a, b, c;
while (1)
{
cin >> a >> b >> c;
if (a == -1 && b == -1 && c == -1)
break;
cout << "w(" << a << ", " << b << ", " << c << ") = " << dfs(a, b, c) << '\n';
}
return 0;
}
- 새롭게 알게 된 점
메모이제이션 사
반응형
'Algorithm > Baekjoon BOJ' 카테고리의 다른 글
[백준][C++] 2563: 색종이 (0) | 2022.11.02 |
---|---|
[백준][C++] 1904: 01타일 (0) | 2022.10.31 |
[백준][C++] 9663: N-Queen (0) | 2022.10.23 |
[백준][C++] 15652 : N과 M (4) (0) | 2022.10.23 |
[백준][C++] 15649 : N과 M (3) (0) | 2022.10.22 |