你必须给2个人,X和Y提供一系列n个水果。当吃第i个水果时,X会获得x_i的快乐,吃第i个水果时Y会获得y_i的快乐。我们希望最大化X和Y的总幸福感。水果的分布不必相等 - 你可以将它们全部交给X或者全部交给Y.
你必须按顺序将水果放入Y中(从第1个到第n个水果),X和Y将在收到水果后立即摄取水果。
味道指标存在一些差异,影响每个水果吃X和Y的快乐程度。该差异由函数T(i,j)定义,并且可在表中查找(成本为O(1)以查找)。因此,如果X刚刚摄入水果i,然后给予果实j,X的幸福将增加(x_j - T(i,j))。
我觉得这个问题应该通过动态编程解决,或者使用贪婪算法但是在制定解决方案时遇到问题。到目前为止我做了什么:
我知道蛮力是(2 ^ n),因为水果分配到X和Y的所有组合都是2 ^ n。我尝试用[i,j,k]做一个DP,其中i和j是n中的起始和结束果实,k是你给第一个人的果实数量(X)。对于DP [0,n,k]的任何k,具有该DP的解决方案将是最大k,但是我似乎无法超出基本情况(难以制作DP的方程式[i,j,k] ])...
答案 0 :(得分:1)
这可以使用动态编程在 n 中的二次时间内求解。如果X吃掉的最后一个水果是 i ,那么 f(i,j)是最大可能的幸福,而Y吃掉的最后一个水果是 j 。让我称第一个水果为水果号0,最后一个水果号为 n - 1 (0-indexed)。然后,你需要计算 f(-1,-1)(最初它们没有吃掉任何水果)。
这种动态编程很容易计算出来,因为如果你知道它们最后吃的水果,你知道下一个要吃的水果。
以下类似C的伪代码具有以下细节:
int dp(int i, int j) {
//Get the current fruit
int current = max(i, j) + 1;
//Base case (I consider the first to be 0, so the last is n - 1)
if (current == n) return 0;
//Check if the value is calculated
if (not calculated[i][j]) {
calculated[i][j] = true;
M[i][j] = max(dp(current, j) + x[current] - T(i, current),
dp(i, current) + y[current] - T(j, current));
}
return M[i][j];
}