<?php
class Solution {
/**
* 方法二:
* 动态规划
* @param $nums
*/
function maxCoinsV2($nums) {
$len = count($nums);
$vals = new SplFixedArray($len+2);
$dp = array_fill(0, $len+2, array_fill(0, $len+2, 0));
$i=1;
foreach ($nums as $num) {
$vals[$i++] = $num;
}
$vals[0] = $vals[$i] = 1;
for ($j=2; $j<=$len+1; $j++) {
for ($i=$j-2; $i>=0; $i--) {
for ($k=$i+1; $k<$j; $k++) {
$sum = $vals[$i] * $vals[$k] * $vals[$j];
$sum += $dp[$i][$k] + $dp[$k][$j];
$dp[$i][$j] = max($sum, $dp[$i][$j]);
}
}
}
return $dp[0][$len+1];
}
private $record = null;
/**
* 方法一:记忆化搜索
* @param Integer[] $nums
* @return Integer
*/
function maxCoins($nums) {
$len = count($nums);
$vals = new SplFixedArray($len+2);
$i = 1;
foreach ($nums as $num) {
$vals[$i++] = $num;
}
$this->record = array_fill(0, $len+2, array_fill(0, $len+2, -1));
$vals[0] = $vals[$i] = 1;
$this->dealSection(0, $len+1, $vals);
return $this->record[0][$len+1];
}
function dealSection($s, $e, $vals) {
if ($s >= $e-1) {
return 0;
}
if ($this->record[$s][$e] == -1) {
$max = PHP_INT_MIN;
for ($i=$s+1; $i<=$e-1; $i++) {
$sum = $vals[$i] * $vals[$s] * $vals[$e];
$sum += $this->dealSection($s, $i, $vals) + $this->dealSection($i, $e, $vals);
$max = max($sum, $max);
}
$this->record[$s][$e] = $max;
}
return $this->record[$s][$e];
}
}
$s = new Solution();
var_dump($s->maxCoinsV2([3,1,5,8]));
戳气球【php版】
最新推荐文章于 2024-06-09 09:14:39 发布