https://www.acmicpc.net/problem/1699
๋ฌธ์
์ด๋ค ์์ฐ์ N์ ๊ทธ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ๊ณฑ์๋ค์ ํฉ์ผ๋ก ๋ํ๋ผ ์ ์๋ค. ์๋ฅผ ๋ค์ด 11=32+12+12(3๊ฐ ํญ)์ด๋ค. ์ด๋ฐ ํํ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ๋ ์ ์๋๋ฐ, 11์ ๊ฒฝ์ฐ 11=22+22+12+12+12(5๊ฐ ํญ)๋ ๊ฐ๋ฅํ๋ค. ์ด ๊ฒฝ์ฐ, ์ํ์ ์ํฌ๋ผํ ์ค๋ “11์ 3๊ฐ ํญ์ ์ ๊ณฑ์ ํฉ์ผ๋ก ํํํ ์ ์๋ค.”๋ผ๊ณ ๋งํ๋ค. ๋ํ 11์ ๊ทธ๋ณด๋ค ์ ์ ํญ์ ์ ๊ณฑ์ ํฉ์ผ๋ก ํํํ ์ ์์ผ๋ฏ๋ก, 11์ ๊ทธ ํฉ์ผ๋ก์จ ํํํ ์ ์๋ ์ ๊ณฑ์ ํญ์ ์ต์ ๊ฐ์๋ 3์ด๋ค.
์ฃผ์ด์ง ์์ฐ์ N์ ์ด๋ ๊ฒ ์ ๊ณฑ์๋ค์ ํฉ์ผ๋ก ํํํ ๋์ ๊ทธ ํญ์ ์ต์๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์์ฐ์ N์ด ์ฃผ์ด์ง๋ค. (1 ≤ N ≤ 100,000)
์ถ๋ ฅ
์ฃผ์ด์ง ์์ฐ์๋ฅผ ์ ๊ณฑ์์ ํฉ์ผ๋ก ๋ํ๋ผ ๋์ ๊ทธ ์ ๊ณฑ์ ํญ์ ์ต์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
ํ์ด
dp[i] = ์ซ์ i์ ์ ๊ณฑ์ ํญ์ ์ต์ ๊ฐฏ์
์ซ์ n์ด ์ฃผ์ด์ก์ ๋,
- n = 1 + dp[n-1]์ ์ ๊ฐ
- n = 4 + dp[n-4]์ ์ ๊ฐ
- n = 9 + dp[n-9]์ ์ ๊ฐ
- n = 16 + dp[n-16]์ ์ ๊ฐ
...
์ด๋ฐ ํํ๋ก ๋ํ๋ผ ์ ์๋ค.
์๋ฅผ ๋ค์ด n=10์ด๋ผ๋ฉด
- 10 = 9 + dp[10-9]์ ์ ๊ฐ = 9 + dp[1]์ ์ ๊ฐ = 9 + (1)
=> ํญ ๊ฐฏ์ 1+dp[1] = 2๊ฐ - 10 = 4 + dp[10-4]์ ์ ๊ฐ = 4 + dp[6]์ ์ ๊ฐ = 4 + (4+1+1)
=> ํญ ๊ฐฏ์ 1+dp[6] = 4๊ฐ - 10 = 1 + dp[10-9]์ ์ ๊ฐ = 1 + dp[9]์ ์ ๊ฐ = 1 + (9)
=> ํญ ๊ฐฏ์ 1+dp[9] = 2๊ฐ
๋ผ๊ณ ํ ์ ์๋ค
์ฆ dp[1]~dp[n]์ ๊ฐ๋ง ์๋ค๋ฉด dp[n+1]์ ๊ฐ์ ๊ตฌํ ์ ์๋ค.
n์์ ์ ๊ณฑ์๋ฅผ ๋นผ์ฃผ๊ณ ๋จ์ ๊ฐ์ ์ ๊ณฑ์ํญ ๊ฐฏ์์ 1์ ๋ํ ๊ฐ์ด n์ ์ ๊ณฑ์ํญ ๊ฐฏ์ ์ด๋ฏ๋ก
n๋ณด๋ค ์์ ์ ๊ณฑ์๋ค์ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋นผ์ ๊ณ์ฐํด์ฃผ๊ณ ์ต์๊ฐ์ ๊ตฌํด์ dp์ ์ ์ฅํด์ฃผ๋ฉด ๋ !
// ํ์ด : https://whkakrkr.tistory.com
#include <iostream>
#include <vector>
using namespace std;
const int INF = 100001;
int main() {
int n;
cin >> n;
vector<int>dp(INF);
dp[0] = 0;
dp[1] = 1;
for(int i=2; i<INF; i++) {
int min_val = i;
for(int j=1; j*j<=i; j++) {
int cur = i - j*j;
if(min_val > dp[cur]) {
min_val = dp[cur];
}
}
dp[i] = min_val+1;
}
cout << dp[n] << "\n";
return 0;
}
'๐๏ธ ICPC Sinchon > Dynamic Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ][C++] ๋ฐฑ์ค 11722๋ฒ: ๊ฐ์ฅ ๊ธด ๊ฐ์ํ๋ ๋ถ๋ถ ์์ด (0) | 2024.08.19 |
---|---|
[BOJ][C++] ๋ฐฑ์ค 10164๋ฒ: ๊ฒฉ์์์ ๊ฒฝ๋ก (0) | 2024.08.15 |
[BOJ][C++] ๋ฐฑ์ค 8394๋ฒ: ์ ์ (0) | 2024.08.14 |
[BOJ][C++] ๋ฐฑ์ค 2293๋ฒ: ๋์ 1 (0) | 2023.11.24 |
[BOJ][C++] ๋ฐฑ์ค 11052๋ฒ: ์นด๋ ๊ตฌ๋งคํ๊ธฐ (0) | 2023.11.20 |