2017-12-25 6 views
0

는 숫자 X를 감안할 때 1 (변형)에 N을 줄이기 위해 :최소 단계는 이러한 작업 중 하나를 수행 할 수 있습니다,

1 씩 감소 X 1.

2 증가 X에 의해 1.

3의 경우 X는 3의 배수가 당신에 의해 X를 나눌 수 있습니다 3.

나는이 문제에 대한 O (n)의 DP 솔루션이 있다고 생각하지만, 어떻게 1 < = X <을 위해 그것을 해결하기 = 10^9? (N은 ~ 3^N, 그것이 ~ 걸리면 2N 간다)

답변

0

이것은 O 작동 (2log_3N) 시간의 일거수 일투족이 같이

  • N 개조 3 == 0 : 3
  • 분할기
  • N 모드 3 == 1 : 빼기 1
  • N 모드 3 == 2 : 1

그래서 우리는 우리가해야 할 3의 요인에 의해 줄이기 위해 최대 2 이동이 필요합니다 추가 ~ N 타임스.

<input type='number' id='nm'/> 
 
<button onclick='go();'>Go</button> 
 
<br> 
 
<span id='out'/> 
 
<script> 
 

 
function go() { 
 
var n=nm.value; 
 
var nc=0; 
 
out.textContent=n; 
 
while (n>1) { 
 
    n3=n%3; 
 
    switch (n3) { 
 
     case 0: {n/=3;break;} 
 
     case 1: {n--;break;} 
 
     case 2: {n++;break;} 
 
    } 
 
    nc++; 
 
    out.textContent+=','+ n; 
 
    } 
 
out.textContent+=' ::'+ nc; 
 
} 
 

 
</script>

+0

이것은 조정할 필요하다면 N의 경우 (N == 2) {N '등 == 2 -, NC++; –

+0

답장을 보내 주셔서 감사합니다. 그러나 왜이 알고리즘이 항상 최적의 솔루션을 제공하는지 설명해 주시겠습니까? – ahmedgu

+0

그것은 3의 가장 가까운 배수로 간다는 점에서 욕심이 많습니다. 3x + 1 및 3^ky-2라고하면, 기본 조작의 수가 동일합니다. 코드가 3x로 이동 한 다음 x로 이동합니다. 그러나 3^ky에 도달하기 위해 두 번 추가하고 y (k + 2 개의 움직임)에 도달하기 위해 k 개의 분할을 추가한다고하더라도, x는 3^{k-1} y-1 (3x = 3^ky -3, 양쪽에 +1을 더함) k + 2도 움직입니다. 마찬가지로 3x-1과 3^k + 2 사이에 끼워진 경우 n = 2를 치면 2-> 3-> 1이 아니라 1로 바로 가십시오. –