算法(动态规划一)n个学生问题
1、题目描述(网易)
有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积吗?
输入描述:
每个输入包含 1 个测试用例。每个测试数据的第一行包含一个整数 n (1 <= n <= 50),表示学生的个数,接下来的一行,包含 n 个整数,按顺序表示每个学生的能力值 ai(-50 <= ai <= 50)。接下来的一行包含两个整数,k 和 d (1 <= k <= 10, 1 <= d <= 50)。
输出描述:
输出一行表示最大的乘积。
解题方法:
<?php # code... $arr = [8,7,2,-7,9,5,4,10,-7,1]; $length = 3; $people = 3; echo getMaxValue($arr, $length, $people); function getMaxValue($arr, $length, $people) { $result = []; $maxArr = []; $minArr = []; $max = -9999999; $min = 9999999; // 初始化 for ($j = 1; $j < count($arr) + 1; $j ++) { $maxArr[1][$j] = $arr[$j - 1]; // 第几个人,第几个位置 $minArr[1][$j] = $arr[$j - 1]; echo $maxArr[1][$j]; echo " "; } echo PHP_EOL; for ($i=1; $i < $length - 1; $i++) { # code...xx $maxArr[$i][1] = $arr[0]; $minArr[$i][1] = $arr[0]; } // 第一层是人数 for ($k = 2; $k < $people + 1; $k ++) { // 第二层是位置数 for($i = 2; $i < count($arr) + 1; $i ++) { $temp = 0; $tempMax = -9999999; $tempMin = 999999; // 计算间隔距离为k的最大值, 从$i - $length开始 到 $i 结束,选择最大的 for ($z = max(1, $i - $length); $z < $i; $z ++) { $resultMax = max($maxArr[$k][$i], max($maxArr[$k - 1][$z] * $arr[$i - 1], $minArr[$k - 1][$z] * $arr[$i - 1])); $resultMin = min($minArr[$k][$i], min($minArr[$k - 1][$z] * $arr[$i - 1], $minArr[$k - 1][$z] * $arr[$i - 1])); if ($resultMax > $tempMax) { $tempMax = $resultMax; } if ($resultMin < $tempMin) { $tempMin = $resultMin; } } $maxArr[$k][$i] = $tempMax; $minArr[$k][$i] = $tempMin; } } for($j = 2; $j < count($arr) + 1; $j++){ $max = max(max($maxArr[$people][$j],$minArr[$people][$j]), $max); } return $max; } ?>