假设我们有两个数组 nums 和大小分别为 n 和 m (n >= m) 的乘数。数组是 1 索引的。现在我们的初始分数是 0。我们想要执行 m 次操作。在第 i 个操作(1 索引)中,我们将 -
从 nums 的开头或结尾从 x 中选择一个值。
将 multipliers[i] * x 添加到分数中。
从数组 nums 中删除 x。
我们必须在执行 m 次操作后找到最大分数。
所以,如果输入像 nums = [5,10,15], multipliers = [5,3,2],那么输出将是 115,因为我们可以取 15 然后乘以 5 得到 5*15 = 75 ,那么 10*3 = 30,所以总数是 75+30 = 105,最后是 5*2 = 10,所以总数是 105+10 = 115。
让我们看看以下实现以获得更好的理解 -
def solve(nums, multipliers): n, m = len(nums), len(multipliers) dp = [[0]*m for _ in range(m+1)] for i in reversed(range(m)): for j in range(i, m): k = i + m - j - 1 dp[i][j] = max(nums[i] * multipliers[k] + dp[i+1][j], nums[j-m+n] * multipliers[k] + dp[i][j-1]) return dp[0][-1] nums = [5,10,15] multipliers = [5,3,2] print(solve(nums, multipliers))
[5,10,15], [5,3,2]输出结果
115