У меня есть рабочее рекурсивное решение проблемы DP. Я хочу sh, чтобы запоминать его.
В настоящее время это зависит от двух состояний: индекса i
и логической переменной true
или false
.
Кто-нибудь может указать как я мог это запомнить? В частности, как я могу инициализировать таблицу мемоизации (dp
)?
Я запутался, потому что, если я инициализирую второе состояние с помощью false
, я не смогу различать false
, которые происходит из-за инициализации, а не из-за того, где на самом деле это значение состояния.
Может кто-нибудь дать совет?
Спасибо.
Для дальнейшего пояснения: Это вот как я прямо сейчас объявляю таблицу dp
:
вектор > dp;
Как инициализировать внутренний vector<bool>
? Я не думаю, что могу установить его либо на true
, либо на false
, так как позже я не смогу различить guish, если это значение , сгенерированное при выполнении (решение проблема) или значение инициализации.
Изменить: Добавление кода:
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/