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 |