Python程序:查找从栈列表中弹出k个元素的最大和
假设我们有一系列栈和一个整数k。我们必须找到从任何栈的组合中弹出恰好k个元素所能达到的最大可能和。
因此,如果输入类似于 stacks = [[50, -4, -15],[2],[6, 7, 8]], k = 4,则输出将为39,因为我们可以从第一个栈弹出所有3个元素,并弹出最后一个栈的最后一个元素以获得 -15 + -4 + 50 + 8 = 39。
为了解决这个问题,我们将遵循以下步骤:
定义一个函数rec()。这将接收i,n
如果n等于k,则
返回0
如果n > k,则
返回负无穷大
如果i等于栈的数量,则
返回负无穷大
如果i等于栈的数量 - 1,则
needed := k - n
如果needed > stacks[i]的元素数量,则
返回负无穷大
否则,
返回stack[i]最后needed个元素的总和
res := -math.inf, su := 0
对于sti in range stacks[i]的大小 - 1 到 0,
递减1,执行su := su + stacks[i, sti]
localres := su + rec(i + 1, n + stacks[i]的大小 - sti)
res := res和localres的最大值
返回res和rec(i + 1, n)的最大值
从主方法调用rec(0, 0)
让我们看看下面的实现,以便更好地理解:
示例
import math class Solution: def solve(self, stacks, k): def rec(i, n): if n == k: return 0 if n > k: return -math.inf if i == len(stacks): return -math.inf if i == len(stacks) - 1: needed = k - n if needed > len(stacks[i]): return -math.inf else: return sum(stacks[i][-needed:]) res, su = -math.inf, 0 for sti in range(len(stacks[i]) - 1, -1, -1): su += stacks[i][sti] localres = su + rec(i + 1, n + len(stacks[i]) - sti) res = max(res, localres) return max(res, rec(i + 1, n)) return rec(0, 0) ob = Solution() stacks = [ [50, -4, -15], [2], [6, 7, 8] ] k = 4 print(ob.solve(stacks, k))
输入
[[50, -4, -15],[2],[6, 7, 8]], 4
输出
39
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP