我想使用记忆优化我的递归解决方案来解决不同的子序列问题
I want to use optimise my recursive solution using memoisation for Distinct Subsequences problem
问题陈述是:
给定两个序列 A 和 B,计算序列 A 中唯一的路数,以形成与序列 B 相同的子序列。
子序列:字符串的子序列是在不打乱剩余字符的相对位置的情况下,通过删除一些(可以是none)字符从原始字符串形成的新字符串。 (即,“ACE”是“ABCDE”的子序列,而“AEC”不是)。
目标:
我想使用 dp
优化我的递归解决方案
我的方法:
我正在尝试制作给定字符串的每个可能的子序列,如果子序列与模式 ans 匹配,则为 ans=ans+1.
我想记住解决方案并使用 dp 来优化时间复杂度,但不知道该怎么做。
代码:
int funct(string &given,string &target,string &curr, int index)
{
if(curr == target)
{
return 1;
}
if( index >= given.size() )
return 0;
int without = funct(given,target,curr,index+1);
curr.push_back(given[index]);
int with = funct(given,target,curr,index+1);
curr.pop_back();
return with+without;
}
int Solution::numDistinct(string A, string B)
{
string s;
return funct(A,B,s,0);
}
- 设A的长度为L1,B的长度为L2。
- 设 f(i,j) 是一个函数,它给出了从序列 A(i...L1-1) 中获取序列 B(j...L2-1) 的方法数,那么你问题的答案就是 f(0,0).
- 请注意序列A(i...L1-1)表示子串A(i...L1-1),B(j...L2-1)表示子串B( j...L2-1).
这里是用C++写的代码:
int memo[100][100];
string A, B;
int f(int i, int j) {
if (i >= A.length() || j >= B.length()) return 0;
if (A[i] == B[j]) {
if (j == B.length() - 1)
memo[i][j] = 1 + f(i + 1 , j);
else
memo[i][j] = f(i + 1, j + 1) + f(i + 1, j);
}
else {
memo[i][j] = f(i + 1, j);
}
return memo[i][j];
}
问题陈述是: 给定两个序列 A 和 B,计算序列 A 中唯一的路数,以形成与序列 B 相同的子序列。 子序列:字符串的子序列是在不打乱剩余字符的相对位置的情况下,通过删除一些(可以是none)字符从原始字符串形成的新字符串。 (即,“ACE”是“ABCDE”的子序列,而“AEC”不是)。
目标: 我想使用 dp
优化我的递归解决方案我的方法: 我正在尝试制作给定字符串的每个可能的子序列,如果子序列与模式 ans 匹配,则为 ans=ans+1.
我想记住解决方案并使用 dp 来优化时间复杂度,但不知道该怎么做。
代码:
int funct(string &given,string &target,string &curr, int index)
{
if(curr == target)
{
return 1;
}
if( index >= given.size() )
return 0;
int without = funct(given,target,curr,index+1);
curr.push_back(given[index]);
int with = funct(given,target,curr,index+1);
curr.pop_back();
return with+without;
}
int Solution::numDistinct(string A, string B)
{
string s;
return funct(A,B,s,0);
}
- 设A的长度为L1,B的长度为L2。
- 设 f(i,j) 是一个函数,它给出了从序列 A(i...L1-1) 中获取序列 B(j...L2-1) 的方法数,那么你问题的答案就是 f(0,0).
- 请注意序列A(i...L1-1)表示子串A(i...L1-1),B(j...L2-1)表示子串B( j...L2-1).
这里是用C++写的代码:
int memo[100][100];
string A, B;
int f(int i, int j) {
if (i >= A.length() || j >= B.length()) return 0;
if (A[i] == B[j]) {
if (j == B.length() - 1)
memo[i][j] = 1 + f(i + 1 , j);
else
memo[i][j] = f(i + 1, j + 1) + f(i + 1, j);
}
else {
memo[i][j] = f(i + 1, j);
}
return memo[i][j];
}