トップページに戻る
次のJavaScriptのサンプルへ
前のJavaScriptのサンプルへ
Q34 左右に行ったり来たり
JavaScriptのソース
Solve( 6);
Solve(12);
function Solve(pN)
{
const UB = pN - 2;
//場合の数[左のマス数][右のマス数]なDP表
var PrevDP = DeriveDPArr(UB);
PrevDP[0][pN - 2] = 1;
for(var I = 1 ; I <= pN - 2 ; I++){
var CurrDP = DeriveDPArr(UB);
for(var J = 0 ; J <= UB ; J++){
for(var K = 0 ; K <= UB ; K++){
if(PrevDP[J][K] == 0) continue;
//右に移動する場合
if(I%2 == 1){
for(var L = 0 ; L <= K - 1 ; L++){
var NewJ = J + L;
var NewK = K - 1 - L;
CurrDP[NewJ][NewK] += PrevDP[J][K];
}
}
//左に移動する場合
else{
for(var L = 0 ; L <= J - 1 ; L++){
var NewJ = J - 1 - L;
var NewK = K + L;
CurrDP[NewJ][NewK] += PrevDP[J][K];
}
}
}
}
PrevDP = CurrDP;
}
document.write('N=' , pN , 'だと' , PrevDP[0][0] , '通り<br>');
}
function DeriveDPArr(pUB)
{
var DPArr = new Array(pUB + 1);
for(var I = 0 ; I <= pUB ; I++){
DPArr[I] = new Array(pUB + 1);
DPArr[I].fill(0);
}
return DPArr;
}
実行結果
N=6だと5通り
N=12だと50521通り
解説
動的計画法で解いてます。