网易笔试题——合唱团

一、题目描述

       有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积吗?

二、解题思路

       方案一(回溯法):从n个学生中选取k名学生,可以理解为在n个数据中,进行深度为k的递归,保持两组数据,一组表示当前的数据,一组表示最优的数据,每组数据含有最佳能力总值、选择的学生编号和这个编号对应的学生能力。

       方案二(动态规划)

三、注意事项

       1.递归开始需要首先判断深度是否超过k。

       2.如果超过了,则进行最佳值判断、最佳值保存和距离为d的判断。

       网易笔试题——合唱团_第1张图片

       3.如果没有超过,则继续进行假设递归,记得保存数据。

       网易笔试题——合唱团_第2张图片

       4.缺陷:此算法时间复杂度较大,不建议使用。

四、代码实现

       见我的github:合唱团(回溯法)

你可能感兴趣的:(算法及其应用,算法工程师进阶之路)