πŸ™‡β€β™€οΈ1둜 λ§Œλ“€κΈ°

μ •μˆ˜ X에 μ‚¬μš©ν•  수 μžˆλŠ” 연산은 λ‹€μŒκ³Ό 같이 μ„Έ 가지 이닀.

  • Xκ°€ 3으둜 λ‚˜λˆ„μ–΄ 떨어지면, 3으둜 λ‚˜λˆˆλ‹€.
  • Xκ°€ 2둜 λ‚˜λˆ„μ–΄ 떨어지면, 2둜 λ‚˜λˆˆλ‹€.
  • 1을 λΊ€λ‹€.

μ •μˆ˜ N이 μ£Όμ–΄μ‘Œμ„ λ•Œ, μœ„μ™€ 같은 μ—°μ‚° μ„Έ 개λ₯Ό 적절히 μ‚¬μš©ν•΄μ„œ 1을 λ§Œλ“€λ €κ³  ν•œλ‹€.

연산을 μ‚¬μš©ν•˜λŠ” 횟수의 μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•˜μ‹œμ˜€.

μž…λ ₯
첫째 쀄에 1보닀 ν¬κ±°λ‚˜ κ°™κ³ , 106보닀 μž‘κ±°λ‚˜ 같은 μ •μˆ˜ N이 주어진닀.

좜λ ₯
첫째 쀄에 연산을 ν•˜λŠ” 횟수의 μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•œλ‹€.

예제 μž…λ ₯ 1 
2

예제 좜λ ₯ 1 
1

예제 μž…λ ₯ 2 
10

예제 좜λ ₯ 2 
3

πŸš€ν’€μ΄

dp문제인데 μ–΄λ–»κ²Œ ν’€ 지 감이 μ•ˆμž‘ν˜€μ„œ μ–΄λ €μ› λ‹€.
μ–Έλœ»λ΄€μ„ 땐 3으둜 λ‚˜λ‰˜λ©΄ κ°€μž₯ μ΅œμ†Œκ°€ λœλ‹€κ³  μƒκ°ν–ˆλŠ”λ° μ•„λ‹ˆμ—ˆλ‹€.

예λ₯Ό λ“€μ–΄μ„œ 17이면
17 -> 16 -> 8 -> 4 -> 3 -> 1
둜 5번이 μ΅œμ†Œκ°’μΈλ° 3으둜 λ‚˜λ‰˜λŠ” 것을 κ³ μ§‘ν•˜λ©΄
17 -> 16 -> 15 -> 5 -> 4 -> 3 -> 1
둜 6번이 λ‚˜μ˜¨λ‹€.

이런 λ°©μ‹μœΌλ‘œλŠ” 문제λ₯Ό ν’€ 수 μ—†μ—ˆλ‹€.
μ—¬λŸ¬κ°€μ§€ 가정을 λ‹€ μƒκ°ν•˜κΈ°μ—” 경우의 μˆ˜κ°€ λ„ˆλ¬΄ λ§Žμ•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

동적 κ³„νšλ²•μ˜ λ°©λ²•μœΌλ‘œλŠ” 값을 κΈ°μ–΅ν•΄λ‘˜ cacheλ₯Ό λ§Œλ“ λ‹€.
ν•΄κ²° 방법은 κ°„λ‹¨ν–ˆλŠ”λ°, 일단 cache[i]μ—λŠ” cache[i - 1] + 1을 μ €μž₯ν•œλ‹€.
ν•˜μ§€λ§Œ i % 3 == 0 이라면 cache[i]와 cache[i/3] + 1쀑 μ΅œμ†Œκ°’μœΌλ‘œ 값을 μ €μž₯ν•œλ‹€.
λ§ˆμ°¬κ°€μ§€λ‘œ i % 2 == 0이라면 cache[i]와 cache[i/2] + 1쀑 μ΅œμ†Œκ°’μœΌλ‘œ 값을 μ €μž₯ν•œλ‹€.

int N;
vector<int> cache;

void solve()
{
	cin >> N;
	cache = vector<int>(N + 1);

	cache[1] = 0; // 1일 λ•ŒλŠ” λ‚˜λˆŒ ν•„μš”κ°€ μ—†μœΌλ‹ˆκΉŒ
	for (int i = 2; i <= N; ++i)
	{
		cache[i] = cache[i - 1] + 1;
		if (i % 3 == 0) 
			cache[i] = min(cache[i], cache[i / 3] + 1);
		if (i % 2 == 0)
			cache[i] = min(cache[i], cache[i / 2] + 1);
	}
	
	cout << cache[N];
}

동적 κ³„νšλ²•μ€ 적응이 μ•ˆλ˜λ„€..

πŸš€μ „μ²΄ μ½”λ“œ

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

int N;
vector<int> cache;

void solve()
{
	cin >> N;
	cache = vector<int>(N + 1);

	cache[1] = 0;
	for (int i = 2; i <= N; ++i)
	{
		cache[i] = cache[i - 1] + 1;
		if (i % 3 == 0)
			cache[i] = min(cache[i], cache[i / 3] + 1);
		if (i % 2 == 0)
			cache[i] = min(cache[i], cache[i / 2] + 1);
	}
	
	cout << cache[N];
}

int main() 
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	//freopen("input.txt", "rt", stdin);

	solve();

	return 0;
}

νƒœκ·Έ:

μΉ΄ν…Œκ³ λ¦¬:

μ—…λ°μ΄νŠΈ: