3040. 相同分数的最大操作数目 II

3040. 相同分数的最大操作数目 II


题目链接:3040. 相同分数的最大操作数目 II

代码如下:

// 记忆化搜索
// 参考链接:https://leetcode.cn/problems/maximum-number-of-operations-with-the-same-score-ii/solutions/2643756/qu-jian-dp-de-tao-lu-pythonjavacgo-by-en-nynz
class Solution {
public:
    int maxOperations(vector<int>& nums) {
        memo = vector<vector<int>>(nums.size(), vector<int>(nums.size()));

        int res1 =
            helper(2, nums.size() - 1, nums[0] + nums[1], nums); // 删除前两个数
        int res2 = helper(0, nums.size() - 3,
                          nums[nums.size() - 2] + nums[nums.size() - 1],
                          nums); // 删除后两个数
        int res3 = helper(1, nums.size() - 2, nums[0] + nums[nums.size() - 1],
                          nums);            // 删除第一个和最后一个数
        return max({res1, res2, res3}) + 1; // 加上第一次操作
    }

    int helper(int i, int j, int target, const vector<int>& nums) {
        for (auto& row : memo) {
            ranges::fill(row, -1); //-1表示没有计算过
        }
        return dfs(i, j, target, nums);
    };

    //表示下标在闭区间 [i,j]内的连续子数组,最多可以执行多少次操作。
    int dfs(int i, int j, int target, const vector<int>& nums) {
        if (i >= j) {
            return 0;
        }
        int& res = memo[i][j];
        if (res != -1) {
            return res;
        } // 之前计算过
        res = 0;
        if (nums[i] + nums[i + 1] == target) {
            res = max(res, dfs(i + 2, j, target, nums) + 1);
        }
        if (nums[j - 1] + nums[j] == target) {
            res = max(res, dfs(i, j - 2, target, nums) + 1);
        }
        if (nums[i] + nums[j] == target) {
            res = max(res, dfs(i + 1, j - 1, target, nums) + 1);
        }
        return res;
    };
    vector<vector<int>> memo;
};
  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值