algorithm - 谷歌组合优化面试题

标签 algorithm math

几周前我在谷歌的面试中被问到这个问题,我没有完全得到答案,我想知道这里是否有人可以帮助我。

您有一个包含 n 个元素的数组。元素为 0 或 1。 您想要将数组拆分成 k 个连续个子数组。每个子数组的大小可以在 ceil(n/2k) 和 floor(3n/2k) 之间变化。您可以假设 k << n。 将数组拆分为 k 个子数组后。每个子数组的一个元素将被随机选择。

设计一种算法,使从 k 个子数组中随机选择的元素的总和最大化。 基本上意味着我们希望以这样的方式拆分数组,使得从每个子数组中选择的元素的所有期望值的总和最大。

你可以假设 n 是 2 的幂。

Example:

Array: [0,0,1,1,0,0,1,1,0,1,1,0]
n = 12
k = 3
Size of subarrays can be: 2,3,4,5,6

Possible subarrays [0,0,1] [1,0,0,1] [1,0,1,1,0]
Expected Value of the sum of the elements randomly selected from the subarrays: 1/3 + 2/4 + 3/5 = 43/30 ~ 1.4333333 

Optimal split: [0,0,1,1,0,0][1,1][0,1,1,0]
Expected value of optimal split: 1/3 + 1 + 1/2 = 11/6 ~ 1.83333333

最佳答案

我认为我们可以使用动态规划来解决这个问题。

基本上,我们有:

f(i,j) is defined as the maximum sum of all expected values chosen from an array of size i and split into j subarrays. Therefore the solution should be f(n,k).

递归方程为:

f(i,j) = f(i-x,j-1) + sum(i-x+1,i)/x where (n/2k) <= x <= (3n/2k)

关于algorithm - 谷歌组合优化面试题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8189334/

相关文章:

algorithm - 关于来自 wiki 的加泰罗尼亚数字的表达

algorithm - 是否有可能提出一个主筛的分布式/多核实现。

algorithm - 顺序搜索分析

c# - Excel 求解器 : Non linear least squares equivalent in C#

java - Leetcode解决方案与本地环境(周边地区)的工作方式不同

java - 剪刀石头布的可扩展解决方案

java - 在 Adapter Android 的 getView 中搜索对象列表的有效方法

c# - 两个网格单元之间的距离,没有对角线

algorithm - 整数组合数与特定列表中的数字

c++ - 结合重复,计算上的差异