题目:有 n 个学生站成一排,每个学生有一个能力值,想从这 n 个学生中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积吗?
输入:
第一行:一个整数 n (1 <= n <= 50),表示学生的个数
第二行: n 个整数,按顺序表示每个学生的能力值 ai(-50<= ai<=50)
第三行:两个整数,k 和 d (1 <= k <= 10, 1 <= d <= 50)输出:
最大乘积
这是一个动态规划问题。
从n个学生中选择k个可以看成:
先从n个学生里选择最后1个,然后在剩下的里选择k-1个,并且让这1个和前k-1个满足约束条件。
last表示第k个人位置,范围[1,n]
left表示第k-1个人的位置[max{k-1,last-d} , last-1]
f[last][k]表示从n个人中选择k个的最大乘积。
f[left][k-1]表示从k前面的left个人中选择k-1个的最大乘积。
ai[i]表示第i个学生的能力值
因为能力值有正有负,所以如果能力值为负,乘以前面求得的最小负积,结果才是最大乘积。
f[][]是存储n个选k个能力值乘积的最大值的数组。