๋ฌธ์
https://www.acmicpc.net/problem/9184
ํ์ด
๋ฌธ์ ์ ๋์์๋ ํจ์๋ฅผ ์์ฑํ๋ฉด ์๋์ ๊ฐ๋ค.
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 (a < b && b < c)
return w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c);
else
return w(a-1, b, c) + w(a-1, b-1, c)
+ w(a-1, b, c-1) - w(a-1, b-1, c-1);
}
์ฌ๊ท์ ํ์๋ฅผ ์ค์ด๊ธฐ ์ํด w์ ๊ฒฐ๊ณผ ๊ฐ์ dp ๋ฐฐ์ด์ ์ ์ฅํ ์ ์๋ค.
- a, b, c์ ๊ฐ์ ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํ 3์ฐจ์ dp ๋ฐฐ์ด์ ์ ์ธํ๋ค.
- w(a, b, c) ํจ์๋ฅผ ์คํํ์ ๋ ๋ฐฐ์ด์ ์ด๋ฏธ ์ ์ฅ๋ ๊ฐ์ด๋ฉด, ์ฌ๊ท ๊ณผ์ ์ ์๋ตํ๊ณ ๊ทธ ๊ฐ์ ๋ถ๋ฌ์จ๋ค.
- ๋ฐฐ์ด์ ๊ฐ์ ์ ์ฅํ ๋ ์ธ๋ฑ์ค์ ์์ ๋๋ 20 ์ด์์ ์๊ฐ ๋ค์ด๊ฐ์ง ์๋๋ก ์ ์ํ๋ค.
์ฝ๋
#include <iostream>
#include <vector>
using namespace std;
vector<vector<vector<int>>> dp;
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) { // ์ธ๋ฑ์ค์ 21 ์ด์์ด ๋ค์ด๊ฐ ์ ์์
return w(20, 20, 20);
} else if (dp[a][b][c]) { // ๊ฐ์ด ์กด์ฌํ๋ฉด ์๋ ์ฌ๊ท ์๋ต
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);
} 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, b, c;
dp.assign(21, vector<vector<int>>(21, vector<int>(21, 0)));
while (true) {
cin >> a >> b >> c;
if (a == -1 && b == -1 && c == -1)
break;
cout << "w(" << a << ", " << b << ", " << c << ") = " << w(a, b, c) << '\n';
}
return 0;
}
'๐ญ Problem Solving > C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค][C++] ์ฒด์ก๋ณต (0) | 2024.05.24 |
---|---|
[BOJ][C++] ๋ฐฑ์ค 1212๋ฒ: 8์ง์ 2์ง์ (0) | 2024.05.24 |
[SWEA][C++] 1209. [S/W ๋ฌธ์ ํด๊ฒฐ ๊ธฐ๋ณธ] 2์ผ์ฐจ - Sum (0) | 2024.05.06 |
[SWEA][C++] 2805. ๋์๋ฌผ ์ํํ๊ธฐ (0) | 2024.05.05 |
[SWEA][C++] 1208. [S/W ๋ฌธ์ ํด๊ฒฐ ๊ธฐ๋ณธ] 1์ผ์ฐจ - Flatten (0) | 2024.04.27 |