숫자 n이 있다고 가정합니다. 이제 다음 중 하나를 수행할 수 있는 연산을 고려하십시오. 1. n을 1로 감소 2. n이 짝수이면 n / 2로 감소 3. n이 3으로 나누어 떨어지면 2로 감소 * (n / 3) 마지막으로 찾기 n을 0으로 줄이는 데 필요한 최소 연산 수.
따라서 입력이 n =16과 같으면 출력은 5가 됩니다. n =16인 경우에도 n/2만큼 4번 감소하면 1이 됩니다. 그런 다음 1을 줄여 0을 얻습니다. 따라서 총 5 작업.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
하나의 맵 dp 정의
-
dfs() 함수를 정의하면 x가 필요합니다.
-
렛 :=x
-
x가 dp에 있으면 -
-
반환 dp[x]
-
-
x <=0이면 -
-
x를 반환
-
-
x가 1과 같으면 -
-
1 반환
-
-
md2 :=x 모드 2
-
md3 :=x 모드 3
-
ret :=최소 {ret, md2 + 1 + dfs((x - md2) / 2), md3 + 1 + dfs((x - md3) / 3)}
-
반환 dp[x] =ret
-
기본 메서드 호출에서 dfs(n)
반환
예
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
#include <bits/stdc++.h>
using namespace std;
unordered_map <int, int> dp;
int dfs(int x){
int ret = x;
if(dp.count(x))
return dp[x];
if(x <= 0)
return x;
if(x == 1)
return 1;
int md2 = x % 2;
int md3 = x % 3;
ret = min({ret, md2 + 1 + dfs((x - md2) / 2), md3 + 1 + dfs((x - md3) / 3)});
return dp[x] = ret;
}
int solve(int n) {
return dfs(n);
}
int main(){
int n = 16;
cout << solve(n);
} 입력
16
출력
5