列表

详情


1770. 执行乘法运算的最大分数

给你两个长度分别 nm 的整数数组 numsmultipliers ,其中 n >= m ,数组下标 从 1 开始 计数。

初始时,你的分数为 0 。你需要执行恰好 m 步操作。在第 i 步操作(从 1 开始 计数)中,需要:

在执行 m 步操作后,返回 最大 分数

 

示例 1:

输入:nums = [1,2,3], multipliers = [3,2,1]
输出:14
解释:一种最优解决方案如下:
- 选择末尾处的整数 3 ,[1,2,3] ,得 3 * 3 = 9 分,累加到分数中。
- 选择末尾处的整数 2 ,[1,2] ,得 2 * 2 = 4 分,累加到分数中。
- 选择末尾处的整数 1 ,[1] ,得 1 * 1 = 1 分,累加到分数中。
总分数为 9 + 4 + 1 = 14 。

示例 2:

输入:nums = [-5,-3,-3,-2,7,1], multipliers = [-10,-5,3,4,6]
输出:102
解释:一种最优解决方案如下:
- 选择开头处的整数 -5 ,[-5,-3,-3,-2,7,1] ,得 -5 * -10 = 50 分,累加到分数中。
- 选择开头处的整数 -3 ,[-3,-3,-2,7,1] ,得 -3 * -5 = 15 分,累加到分数中。
- 选择开头处的整数 -3 ,[-3,-2,7,1] ,得 -3 * 3 = -9 分,累加到分数中。
- 选择末尾处的整数 1 ,[-2,7,1] ,得 1 * 4 = 4 分,累加到分数中。
- 选择末尾处的整数 7 ,[-2,7] ,得 7 * 6 = 42 分,累加到分数中。
总分数为 50 + 15 - 9 + 4 + 42 = 102 。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int maximumScore(vector<int>& nums, vector<int>& multipliers) { } };

golang 解法, 执行用时: 100 ms, 内存消耗: 7.8 MB, 提交时间: 2023-10-25 23:59:38

func maximumScore(nums []int, multipliers []int) int {
	n, m := len(nums), len(multipliers)
	dp := make([]int, m+1)
	for d := n - m + 1; d <= n; d++ {
		for i := 0; i <= n-d; i++ {
			j := i + d
			p := i + n - j
			op1 := dp[i+1] + nums[i]*multipliers[p]
			op2 := dp[i] + nums[j-1]*multipliers[p]
			if op1 > op2 {
				dp[i] = op1
			} else {
				dp[i] = op2
			}
		}
	}
	return dp[0]
}

python3 解法, 执行用时: 716 ms, 内存消耗: 41.7 MB, 提交时间: 2023-10-25 23:59:14

class Solution:
    def maximumScore1(self, nums: List[int], muls: List[int]) -> int:
        n, m = len(nums), len(muls)
        
        @cache
        def help(beg: int, end: int, i: int) -> int:
            if i == m: return 0
            return max(nums[beg] * muls[i] + help(beg + 1, end, i + 1), nums[end] * muls[i] + help(beg, end - 1, i + 1))

        ans = help(0, n - 1, 0)
        
        del help
        
        return ans
        
    def maximumScore(self, nums: List[int], muls: List[int]) -> int:
        import gc
        n, m = len(nums), len(muls)
        
        @cache
        def help(beg: int, end: int, i: int) -> int:
            if i == m: return 0
            return max(nums[beg] * muls[i] + help(beg + 1, end, i + 1), nums[end] * muls[i] + help(beg, end - 1, i + 1))

        ans = help(0, n - 1, 0)
        
        gc.collect()
        
        return ans

java 解法, 执行用时: 22 ms, 内存消耗: 54.8 MB, 提交时间: 2023-10-25 23:58:07

class Solution {
    public int maximumScore(int[] nums, int[] multipliers) {
        int n = nums.length,m = multipliers.length;
        int[][] dp = new int[1000 + 5][1000 + 5];
        dp[0][0] = 0;
        for (int i = 1;i <= m;++i) dp[i][0] = dp[i - 1][0] + nums[i - 1] * multipliers[i - 1];
        for (int j = 1;j <= m;++j) dp[0][j] = dp[0][j - 1] + nums[n - j] * multipliers[j - 1];
        for (int i = 1;i <= m;++i){
            for (int j = 1;i + j <= m;++j){
                dp[i][j] = Math.max(dp[i - 1][j] + nums[i - 1] * multipliers[i + j - 1],dp[i][j - 1] + nums[n - j] * multipliers[i + j - 1]);
            }
        }
        int ans = Integer.MIN_VALUE;
        for (int i = 0;i <= m;++i) ans = Math.max(ans,dp[i][m - i]);
        return ans;
    }
}

cpp 解法, 执行用时: 112 ms, 内存消耗: 73 MB, 提交时间: 2023-10-25 23:57:51

class Solution {
public:
    int maximumScore1(vector<int>& nums, vector<int>& multipliers) {
        vector<vector<long long>> dp(1005, vector<long long>(1005, 0));
        long long m = multipliers.size(), res = INT_MIN, n = nums.size();
        for(int k = 1; k <= m; ++k){
            for(int i = 0; i <= k; i++){
                if(i == 0) dp[i][k - i] = dp[i][k - i - 1] + nums[n - k + i] * multipliers[k - 1];
                else if(i == k) dp[i][k - i] = dp[i - 1][k - i] + nums[i - 1] * multipliers[k - 1];
                else dp[i][k - i] = max(dp[i][k - i - 1] + nums[n - k + i] * multipliers[k - 1], dp[i - 1][k - i] + nums[i - 1] * multipliers[k - 1]);
                if(k == m) res = max(res, dp[i][k - i]);
            }
        }
        return res;
    }

    // dp[i][j]:表示nums数组中前i个数和后j个数组成的最大分数。
    int maximumScore(vector<int>& nums, vector<int>& multipliers) {
        int n = nums.size(),m = multipliers.size();
        int dp[1000 + 5][1000 + 5];
        dp[0][0] = 0;
        for (int i = 1;i <= m;++i) dp[i][0] = dp[i - 1][0] + nums[i - 1] * multipliers[i - 1];
        for (int j = 1;j <= m;++j) dp[0][j] = dp[0][j - 1] + nums[n - j] * multipliers[j - 1];
        for (int i = 1;i <= m;++i){
            for (int j = 1;i + j <= m;++j){
                dp[i][j] = max(dp[i - 1][j] + nums[i - 1] * multipliers[i + j - 1],dp[i][j - 1] + nums[n - j] * multipliers[i + j - 1]);
            }
        }
        int ans = INT_MIN;
        for (int i = 0;i <= m;++i){
            ans = max(ans,dp[i][m - i]);
        }
        return ans;
    }
};

上一题