μ¬νκΉμ§ λλ μ½λ©μ κ°μΌλ‘λ§ λ λ§νκΈ°λ§ ν κ² κ°λ€.
DP(Dynamic Programming)μμ μ μΌ μ€μν κ²μ΄ μ νμ μΈμ°κΈ°λΌλ κ²μ μ΄μ μΌ μ λλ‘ μ΄ν΄νλ€.
λ¬Έμ μ κ° κ·μΉμ 곡μμΌλ‘ λ§λ€κ³ , μ΄κ²μ νλμ μνμμΌλ‘ λ§λλκ²μ΄ μ νμμ΄μλ€.
1463λ² λ¬Έμ λ DPλ°©λ²μ€ λ©λͺ¨μ΄μ μ΄μ μ μ΄μ©ν΄μ νλ©΄ μ΅μ νλ λ΅μ΄ λμλ€.
λ΄ μ½λ - μ λ΅ λͺ»λ§μΆ€(μ νμ μ¬μ©X)
#include <iostream> using namespace std; long long c; vector<long long> v; long long minDiv(int N) { if (N <= 1) return N; long long three, two,mi; three = (N % 3) + (N / 3); two = (N % 2) + (N / 2); if (three <= two) { mi = 3; c += (N % 3); } else if(two < three) mi = 2; N /= mi; c++; return N; } int main() { long long N; cin >> N; while ((N = minDiv(N)) > 1); cout << c << endl; return 0; } | cs |
μ λ΅ μ½λ(μ νμ,λ©λͺ¨μ΄μ μ΄μ μ¬μ©)
(μ΄ λΈλ‘κ·Έλ₯Ό μ°Έκ³ νμμ΅λλ€. κ°μ¬ν©λλ€.)
λ¬Έμ |
λ¬Έμ
μ μ Xμ μ¬μ©ν μ μλ μ°μ°μ λ€μκ³Ό κ°μ΄ μΈ κ°μ§ μ΄λ€.
- Xκ° 3μΌλ‘ λλμ΄ λ¨μ΄μ§λ©΄, 3μΌλ‘ λλλ€.
- Xκ° 2λ‘ λλμ΄ λ¨μ΄μ§λ©΄, 2λ‘ λλλ€.
- 1μ λΊλ€.
μ μ Nμ΄ μ£Όμ΄μ‘μ λ, μμ κ°μ μ°μ° μΈ κ°λ₯Ό μ μ ν μ¬μ©ν΄μ 1μ λ§λ€λ €κ³ νλ€. μ°μ°μ μ¬μ©νλ νμμ μ΅μκ°μ μΆλ ₯νμμ€.
μ λ ₯
첫째 μ€μ 1λ³΄λ€ ν¬κ±°λ κ°κ³ , 106λ³΄λ€ μκ±°λ κ°μ μ μ Nμ΄ μ£Όμ΄μ§λ€.
μΆλ ₯
첫째 μ€μ μ°μ°μ νλ νμμ μ΅μκ°μ μΆλ ₯νλ€.
νμ΄κ³Όμ |
(1) κ·μΉ
1. Xκ° 3μΌλ‘ λλμ΄ λ¨μ΄μ§λ©΄, 3μΌλ‘ λλλ€ : D[N] = D[N/3]+1
2. Xκ° 2λ‘ λλμ΄ λ¨μ΄μ§λ©΄, 2λ‘ λλλ€ : D[N] =D[N/2]+1
3. 1μ λΊλ€ : D[N] = D[N-1]+1
(2) μμ
μμ λ¬Έμ μ λΆν° ν° λ¬Έμ λ₯Ό νμ΄κ°λ λ°©μμ λλ€.
μ«μ 1μμ λΆν°
2λ‘ κ°λμ κ²½μ° μ€ κ°μ₯ μμ λ°©λ²μ λ©λͺ¨μ΄μ μ΄μ μ μ μ₯,
3μΌλ‘ κ°λμ κ²½μ°μ€ μμ λ°©λ²μ λ©λͺ¨μ΄μ μ΄μ μ μ μ₯....
NκΉμ§ λ°λ³΅ν©λλ€.
(3) μ½λ
#include <iostream> #include <algorithm> using namespace std; long long c; int memo[1000001];//λ©λͺ¨μ΄μ μ΄μ
int main() { int N; cin >> N; //bottom-up /* N%3==0 then N/=3 -> D[N] = D[N/3]+1 N%2==0 then N/=2 -> D[N] = D[N/2]+1 N-- -> D[N] = D[N-1]+1 */ memo[1] = 0;//1μΌλλ μ λ΅μ΄λ―λ‘ νμX for (int i = 2; i <= N; i++) { memo[i] = memo[i - 1] + 1; if (i % 3 == 0) memo[i] = min(memo[i],memo[i / 3] + 1);//1λνκ°μ΄ μμμ§ i/3+1κ°μ΄ μμμ§ if (i % 2 == 0) memo[i] = min(memo[i], memo[i / 2] + 1);//1λνκ°μ΄ μμμ§ i/2+1κ°μ΄ μμμ§ } cout << memo[N] << endl; return 0; } | cs |