问题说明
* 有 n 个学生站成一排,每个学生有一个能力值,
* 牛牛想从这 n 个学生中按照顺序选取 k 名学生,
* 要求相邻两个学生的位置编号的差不超过 d,
* 使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积吗?
为了方便理解,我们假设每个学生的能力值都是正数
-
一共有n个学生,我们用正整数数组arr[n]表示
-
需要在n个学生中找到k个人的问题其实可以理解为:
- 已经找到了最后一个人的位置
- 再找到前面k-1个人的位置即可
-
不妨用一个select[k][n]数组表示
- select[i][j]:表示一共选择了i+1个人,且最后一人位置在j时的乘积
-
那么select[i][j]该怎么表示呢?
- 我们可以知道select[0][0] ~ select[0][n-1]表示只选择一个人且这个人位置在任意时的乘积,
select[0][0]的值是等于arr[0]的,同理select[0][j]=arr[j]- 也就是当我们画出select数组时,select[0]这一行的所有数据都可以确定
我们假设arr={5,2,3,8,1},n=5,k=3,d=2
2. 再来看第二行,select[1][0]表示选择了2个学生,最后一个位置为第0号
- 也就是当我们画出select数组时,select[0]这一行的所有数据都可以确定
- 我们可以知道select[0][0] ~ select[0][n-1]表示只选择一个人且这个人位置在任意时的乘积,