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