我有一个递归解决动态规划问题的有效解法。我想将其存入记忆化。
目前它依赖于两个状态:索引i
和布尔变量true
或false
。
请问有人能指出我如何进行记忆化吗?具体来说,我该如何初始化记忆化表(dp
)?
我很困惑,因为如果我用false
来初始化第二个状态,我就无法区分初始化产生的false
和实际作为状态值的false
之间的区别。
请问有人能提供一些建议吗?
谢谢。
进一步澄清:这是我现在声明dp
表的方式:
vector<vector < bool > > dp;
我该如何初始化内部的vector<bool>
? 我认为我不能将其设置为true
或false
,因为后面我将无法区分它是执行(解决问题)生成的值还是初始化值。
编辑:添加代码:
class Solution {
public:
unordered_map<int, int> m1, m2;
vector<int> n1, n2;
vector<vector<int>> v;
int helper(int i, bool parsingNums1) {
if((parsingNums1 && i>=n1.size()) || (!parsingNums1 && i>=n2.size())) return v[i][parsingNums1]=0;
if(v[i][parsingNums1]!=-1) return v[i][parsingNums1];
int ans=0;
if(parsingNums1) {
//we are traversing path 1
//see if we can switch to path 2
if(m2.find(n1[i])!=m2.end())
ans=n1[i] + helper(m2[n1[i]]+1, false);
ans=max(ans, n1[i] + helper(i+1, true));
}
if(!parsingNums1) {
//we are traversing path 2
//see if we can switch to path 1
if(m1.find(n2[i])!=m1.end())
ans=n2[i] + helper(m1[n2[i]]+1, true);
ans=max(ans, n2[i] + helper(i+1, false));
}
return v[i][parsingNums1]=ans;
}
int maxSum(vector<int>& nums1, vector<int>& nums2) {
for(int i=0; i<nums1.size(); i++)
m1[nums1[i]]=i;
for(int i=0; i<nums2.size(); i++)
m2[nums2[i]]=i;
n1=nums1;
n2=nums2;
v.resize((nums1.size()>nums2.size()?nums1.size()+1:nums2.size()+1), vector<int>(2,-1));
return max(helper(0, true), helper(0, false))%(int)(1e9+7);
}
};
我正在解决这道LeetCode问题:https://leetcode.com/problems/get-the-maximum-score/
vector<vector < int > > dp;
,我可以使用“-1”初始化内部的vector<int>
,这样我就可以通过检查dp[0][1] != -1
来直接返回。 - user8305079bool
;所以如果我理解你的意思正确的话,我认为你建议我使用一个int
。因此,基本上是vector<vector<int>>
并用-1
初始化内部的vector<int>
。这不就是你建议的吗? - user8305079