算法(动态规划一)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;
}
?>