b_lc_执行乘法运算的最大分数(稍微不同的记忆化)
选择数组A开头或者末尾的整数x,获得B[i]*x分,并累加到S中。将x从A中移除。问能拿到的最大分数S。(len(A)<1e5, len(B)<1e3)
思路:len(A)很大,所以数组f的大小定位在len(B)中,且f表示的意义仅限于B
f[l][r]表示从B中的左边拿了l个且在右边拿了r个时获得的最大分数
class Solution:
def maximumScore(self, A: List[int], B: List[int]) -> int:
n, m = len(A), len(B)
f = [[-1]*(m+1) for _ in range(m+1)]
def dfs(l,r,i):
if i >= m: return 0
if f[l][r] != -1: return f[l][r]
lv, rv = B[i]*A[l]+dfs(l+1,r,i+1), B[i]*A[n-r-1]+dfs(l,r+1,i+1)
f[l][r] = max(lv, rv)
return f[l][r]
return dfs(0,0,0)