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)
原文地址:https://www.cnblogs.com/wdt1/p/14426053.html