https://www.acmicpc.net/problem/9184
1. 동적계획법이라고 해서 무조건 재귀 호출이 없는것은 아니다
처음에 DP를 한차원의 크기가 101 인 배열로 만드려고 하다가 실패하였다.
한 차원의 크기가 21이여도 충분하다,
간단하게 처리할 수 있는 부분(a,b,c중 하나라도 0이하이거나 , 20이상일때)은 함수 재귀 호출을 하고
시간처리가 중요한 구간은 DP의 데이터를 리턴하도록 해서 시간단축을 한다
2. vector 의 초기화와 달리 Array의 초기화는 main 함수내에서 fill 함수를 사용해서 해야한다.
fill(초기화할 주소값의 시작 , 초기화할 주소값의 끝 , 초기화할 값)
DP의 시작주소에서 DP의 size를 int의 size로 나눈것만큼이 이동하면 그게 끝 주소이다.
#include <iostream>
#include <algorithm>
using namespace std;
// 3차원 배열 DP 선언
int DP[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 (DP[a][b][c] != -1) {
return DP[a][b][c];
}
// 재귀가 발생하지 않게 해야 한다
else if (a < b && b < c) {
DP[a][b][c] = w(a,b,c - 1) + w(a,b - 1,c - 1) - w(a,b - 1,c);
return DP[a][b][c];
}
else {
DP[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 DP[a][b][c];
}
}
int main() {
// 입력
int A = 0;
int B = 0;
int C = 0;
// 3차원 배열을 0이 아닌 -1로 한번 초기화 해보고싶었다
fill(&DP[0][0][0], &DP[0][0][0] + sizeof(DP) / sizeof(int), -1);
while (true) {
cin >> A >> B >> C;
if (A == -1 && B == -1 && C == -1) {
break;
}
cout << "w(" << A << ", " << B << ", " << C << ")" << " = " << w(A,B,C)<< "\n";
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[C++] 백준11725 : 트리의 부모찾기 (0) | 2024.01.16 |
---|---|
[Python] 백준 14891 : 톱니바퀴 (3) | 2024.01.04 |
[C++] 백준 14500 : 테트로미노 (브루트포스) (0) | 2024.01.03 |
[C++] 백준 1463 : 1로 만들기 (0) | 2023.12.28 |
[C++] 백준28278 : 스택 2 (0) | 2023.12.17 |