Complete-Preparation

🎉 One-stop destination for all your technical interview Preparation 🎉

View the Project on GitHub

1770. Maximum Score from Performing Multiplication Operations 🌟🌟

You are given two integer arrays nums and multipliers of size n and m respectively, where n >= m. The arrays are 1-indexed.

You begin with a score of 0. You want to perform exactly m operations. On the ith operation (1-indexed), you will:

Return the maximum score after performing m operations.

Recursion (TLE)

Code

class Solution {
private:
    int helper(vector<int>& nums, vector<int>& multipliers, int i, int l)
    {
        int n = nums.size();
        int m = multipliers.size();

        if (i == m) return 0;
        int pickLeft = (multipliers[i] * nums[l]) + (helper(nums, multipliers, i + 1, l + 1));
        int pickRight = (multipliers[i] * nums[n - (i - l) - 1]) + (helper(nums, multipliers, i + 1, l));

        return max(pickLeft, pickRight);
    }

public:
    int maximumScore(vector<int>& nums, vector<int>& multipliers)
    {
        return helper(nums, multipliers, 0, 0);
    }
};

Memoization (Top-Down) (AC)

Code

class Solution {
private:
    int helper(vector<int>& nums, vector<int>& multipliers, vector<vector<int>>& memo, int i, int l)
    {
        int n = nums.size();
        int m = multipliers.size();

        if (i == m) return 0;
        if(memo[l][i] != -1) return memo[l][i];
        int pickLeft = (multipliers[i] * nums[l]) + (helper(nums, multipliers, memo, i + 1, l + 1));
        int pickRight = (multipliers[i] * nums[n - (i - l) - 1]) + (helper(nums, multipliers, memo, i + 1, l));

        return memo[l][i] = max(pickLeft, pickRight);
    }

public:
    int maximumScore(vector<int>& nums, vector<int>& multipliers)
    {
        int m = multipliers.size();
        vector<vector<int>> memo(m,vector<int>(m,-1)); // size is M x M not N x N

        return helper(nums, multipliers, memo, 0, 0);
    }
};

Tabulation (Bottom-Up) (AC-fastest)

Code

class Solution {
public:
    int maximumScore(vector<int>& nums, vector<int>& multipliers)
    {
        int n = nums.size();
        int m = multipliers.size();
        int dp[1001][1001] = {};

        for (int i = m - 1; i >= 0; i--) {
            int mult = multipliers[i];
            for (int left = i; left >= 0; left--) {
                int right = n - 1 - (i - left);
                int pickLeft = mult * nums[left] + dp[i + 1][left + 1];
                int pickRight = mult * nums[right] + dp[i + 1][left];
                dp[i][left] = max(pickLeft, pickRight);
            }
        }
        return dp[0][0];
    }
};

MUST READ