0
は、あなたは、これらの操作のいずれかを実行させます。最小ステップ(バリアント)
3-もしXは3の倍数は、あなたがでXを分割することができている3
私は問題のO(n)のDPソリューションがあると思うが、どのように1 < = X <のためにそれを解決するために= 10^9?
は、あなたは、これらの操作のいずれかを実行させます。最小ステップ(バリアント)
3-もしXは3の倍数は、あなたがでXを分割することができている3
私は問題のO(n)のDPソリューションがあると思うが、どのように1 < = X <のためにそれを解決するために= 10^9?
一挙一動があるように、これは、(N〜3^n個あれば、それは2Nが行く〜かかります)O(2log_3N)時間で動作します:3 による除算:
は、私たちは私たちが行う必要が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>
これは微調整を必要とする場合、n個の場合(N == 2)N { 'のような== 2、 - ; NC++。 –
答えをありがとう、しかし、なぜこのアルゴリズムが常に最適な解を与えるのか説明できますか? – ahmedgu
それは3の最も近い倍数になるという点で欲張りです。3x + 1と3^ky-2の場合、同じ基本操作数を与えます:私のコードは3xに、次にxになります。しかし、たとえそれが3^kyに到達するために2回加算され、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に直進します。 –