zoukankan      html  css  js  c++  java
  • 算法(动态规划一)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;
        }
    ?>


  • 相关阅读:
    ubuntu安装pgAdmin 4
    python 读取文件
    byobu copy
    vim快捷键汇总
    python 停止线程
    python执行外部命令并获取输出
    gevent mysql
    python类型转换
    量化交易
    Java集合:HashMap底层实现和原理(源码解析)
  • 原文地址:https://www.cnblogs.com/cjjjj/p/12443419.html
Copyright © 2011-2022 走看看