728x90
https://www.acmicpc.net/problem/9184
문제 풀이
3차원 배열을 만들어서 배열에 값을 저장한다. 이때, 배열의 크기는 -50 ~ 50까지 할당할 필요 없다.
왜냐하면 20 이상의 값은 w(20,20,20)과 동일하고, 0 이하의 값은 1과 동일하기 때문이다.
배열에 값이 존재한다면 그냥 리턴하면 되고 아니라면 맞는 조건에 따라 계산하면 된다.
이전의 문제와 동일하게 배열은 다시금 계산을 할 필요 없게 만들어준다.
느낀 점
이전의 문제와 크게 다를 것이 없어 생각보다 쉬웠다.
코드
#include <iostream>
using namespace std;
int a, b, c;
int board[21][21][21];
int w(int a, int b, int c) {
if (a <= 0 || b <= 0 || c <= 0) return 1;
else if (a > 20 || b > 20 || c > 20) return w(20, 20, 20);
else if (board[a][b][c] != 0) return board[a][b][c];
else {
if (a < b && b < c) {
board[a][b][c] = w(a, b, c - 1) + w(a, b - 1, c - 1) - w(a, b - 1, c);
}
else {
board[a][b][c] = w(a - 1, b, c) + w(a - 1, b - 1, c) + w(a - 1, b, c - 1) - w(a - 1, b - 1, c - 1);
}
}
return board[a][b][c];
}
int main() {
while (true) {
cin >> a >> b >> c;
if (a == -1 && b == -1 && c == -1) break;
cout << "w(" << a << ", " << b << ", " << c << ") = " << w(a, b, c) << "\n";
}
}
'문제 풀이 > 백준(BOJ)' 카테고리의 다른 글
[C++] 백준 9461번 : 파도반 수열 (0) | 2021.05.29 |
---|---|
[C++] 백준 1904번 : 01타일 (0) | 2021.05.29 |
[C++] 백준 1003번 : 피보나치 함수 (0) | 2021.05.28 |
[C++] 백준 14889번 : 스타트와 링크 (0) | 2021.05.26 |
[C++] 백준 14888번 : 연산자 끼워넣기 (0) | 2021.05.26 |
댓글