http://qiita.com/Nabetani/items/7ba11167ea28c929fcf2
http://nabetani.sakura.ne.jp/hena/ord23snakemoinc/
くねくね増加列
5*5のマス目から単調増加列を全て取り出した場合、最も長いものを探す。
極めてふつーに、伸ばせるところに手を伸ばしているだけです。
メモ化すら行っていないという手抜きっぷり。
まあ計算量が問題になるサイズではないからいいでしょう。
かかった時間は50分くらい。
ところで概ね毎回のことなんだが、他人の回答例を見てみても全く理解できぬ。
http://nabetani.sakura.ne.jp/hena/ord23snakemoinc/
くねくね増加列
5*5のマス目から単調増加列を全て取り出した場合、最も長いものを探す。
<?php class SNAKEMOINC{ /** * くねくね増加列 * @param String 「01224/82925/69076/32298/21065」みたいな文字列 * @return int 「6」みたいな数値 */ public function get($input){ $input = str_replace('/', '', $input); $tmp=[]; for($i=0;$i<strlen($input);$i++){ // 各升スタートでの最大長を取得 $tmp[] = $this->getMax($input, $i, 1); } // 一番長かった枝 return max($tmp); } /** * 最長ルートを取得 * @param String input * @param int 開始位置 * @param int 現在のルート長 * @return int 最大ルート長 */ private function getMax($input, $pos, $loop){ $tmp=[$loop]; foreach($this->getLargeAdjacent($input, $pos) as $val){ $tmp[] = $this->getMax($input, $val, $loop+1); } return max($tmp); } /** * 隣接4箇所のうち、自分より大きいところがあれば取得 * @param String input * @param int 現在位置 * @return [] 隣接位置 */ private function getLargeAdjacent($input, $pos){ $ret = []; foreach($this->getAdjacent($pos) as $val){ if($input[$pos] < $input[$val]){ $ret[] = $val; } } return $ret; } /** * 隣接4箇所の位置を取得 * @param int 現在位置 * @return [] 隣接位置 */ private function getAdjacent($pos){ if($pos>=5){ $ret[] = $pos-5; } // 上 if($pos<20){ $ret[] = $pos+5; } // 下 if($pos%5!==0){ $ret[] = $pos-1; } // 左 if($pos%5!==4){ $ret[] = $pos+1; } // 右 return $ret; } } // テスト $test = [ ['01224/82925/69076/32298/21065', '6'], /* 省略 */ ]; $snakemoinc = new SNAKEMOINC(); foreach($test as $key=>$data){ $answer = $snakemoinc->get($data[0]); if($answer !== (int)$data[1]){ print('えらー'); } }
極めてふつーに、伸ばせるところに手を伸ばしているだけです。
メモ化すら行っていないという手抜きっぷり。
まあ計算量が問題になるサイズではないからいいでしょう。
かかった時間は50分くらい。
ところで概ね毎回のことなんだが、他人の回答例を見てみても全く理解できぬ。
PR