Giả sử chúng ta có một danh sách các ngăn xếp và một số nguyên k. Chúng ta phải tìm ra tổng tối đa có thể đạt được từ việc tách ra chính xác k phần tử từ bất kỳ sự kết hợp nào của các ngăn xếp.
Vì vậy, nếu đầu vào giống như ngăn xếp =[[50, -4, -15], [2], [6, 7, 8]], k =4, thì đầu ra sẽ là 39, vì chúng ta có thể tắt tất cả 3 phần tử từ ngăn xếp đầu tiên và bật phần tử cuối cùng của ngăn xếp cuối cùng để nhận -15 + -4 + 50 + 8 =39.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
Định nghĩa một hàm rec (). Điều này sẽ đưa tôi, n
-
nếu n giống k thì
-
trả về 0
-
-
nếu n> k thì
-
trả về âm vô cùng
-
-
nếu tôi giống với số lượng ngăn xếp, thì
-
trả về âm vô cùng
-
-
nếu tôi giống với số lượng ngăn xếp - 1, thì
-
cần thiết:=k - n
-
nếu cần> số phần tử của ngăn xếp [i], sau đó
-
trả về âm vô cùng
-
-
nếu không,
-
trả về tổng các phần tử của ngăn xếp [i] số phần tử cần thiết cuối cùng
-
-
-
res:=-math.inf, su:=0
-
cho sti trong phạm vi kích thước của ngăn xếp [i] - 1 đến 0,
giảm đi 1, thực hiện-
su:=su + ngăn xếp [i, sti]
-
localres:=su + rec (i + 1, n + kích thước của ngăn xếp [i] - sti)
-
res:=tối đa res và localres
-
-
trả về tối đa res và rec (i + 1, n)
-
Từ phương thức chính gọi rec (0, 0)
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
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))
Đầu vào
[[50, -4, -15],[2],[6, 7, 8]], 4
Đầu ra
39