网易17校招编程笔试题Java解法赏析(更新至第9题)
1 合唱团(动态规划) 分析 要求n个学生中选择k个,使这k个学生的能力值乘积最大。这是一个最优化的问题。 另外,在优化过程中,提出了相邻两个学生的位置编号差不超过d的约束。 如果不用递归或者动态规划,问题很难入手,并且,限制条件d也需要对每一个进行约束,编程十分复杂 所以,解决的方法是采用动态规划(原因:1.最优化问题2.可分解为最优子结构) 分解 1.对该问题的分解是关键。 从n个学生中,选择k个,可以看成是:先从n个学生里选择最后1个,然后在剩下的里选择k-1个,并且让这1个和前k-1个满足约束条件 2.数学描述 记第k个人的位置为one,则可以用f[one][k]表示从n个人中选择k个的方案。 然后,它的子问题,需要从one前面的left个人里面,选择k-1个,这里left表示k-1个人中最后一个(即第k-1个)人的位置,因此,子问题可以表示成f[left][k-1]. 学生能力数组记为arr[n+1],第i个学生的能力值为arr[i] one表示最后一个人,其取值范围为[1,n]; left表示第k-1个人所处的位置,需要和第k个人的位置差不超过d,因此 max{k-1,on...
