トップページに戻る
次のPHPのサンプルへ
前のPHPのサンプルへ
Q19 バランスのよいカーテンフック
PHPのソース
<?php
Solve( 6,4);
Solve(50,35);
function Solve($pRunner,$pHook)
{
$UB = $pRunner - 3;
//場合の数[現在位置]なDP表
$PrevDP = array();
$PrevDP[0] = 1;
for($I = 1; $I <= $pHook - 2 ; $I++){
$CurrDP = array();
foreach($PrevDP as $EachKey => $EachVal){
if($UB < $EachKey) continue;
for($J = 0 ; $J <= 1 ; $J++){
$NewKey = $EachKey + $J + 1;
if(array_key_exists($NewKey,$CurrDP))
$CurrDP[$NewKey] += $PrevDP[$EachKey];
else $CurrDP[$NewKey] = $PrevDP[$EachKey];
}
}
//echo "{$I}回目のDP結果";
//var_export($CurrDP);
$PrevDP = $CurrDP;
}
$Answer = 0;
for($I = 0 ; $I <= 1 ; $I++){
if($PrevDP[$UB + $I] > 0)
$Answer += $PrevDP[$UB + $I];
}
printf('ランナー数=%d,フック数=%dだと、%d通り',$pRunner,$pHook,$Answer);
echo PHP_EOL;
}
実行結果
ランナー数=6,フック数=4だと、3通り
ランナー数=50,フック数=35だと、1855967520通り
解説
動的計画法で解いてます。