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;
};