Recursion 我想用记忆优化我的递归解决方案来解决不同的子序列问题

Recursion 我想用记忆优化我的递归解决方案来解决不同的子序列问题,recursion,dynamic-programming,Recursion,Dynamic Programming,问题陈述是: 给定两个序列A和B,计算序列A中唯一方式的数量,以形成与序列B相同的子序列。 子序列:字符串的子序列是从原始字符串中删除一些字符(可以是无字符)而形成的新字符串,而不会干扰其余字符的相对位置。(即,“ACE”是“ABCDE”的子序列,而“AEC”不是) 目标: 我想使用dp优化我的递归解决方案 我的做法: 我正在尝试生成给定字符串的每个可能的子序列,如果子序列与模式ans匹配,则ans将为ans=ans+1 我想记住解决方案,并使用dp优化时间复杂性,但无法思考如何做到这一点 代码

问题陈述是: 给定两个序列A和B,计算序列A中唯一方式的数量,以形成与序列B相同的子序列。 子序列:字符串的子序列是从原始字符串中删除一些字符(可以是无字符)而形成的新字符串,而不会干扰其余字符的相对位置。(即,“ACE”是“ABCDE”的子序列,而“AEC”不是)

目标: 我想使用dp优化我的递归解决方案

我的做法: 我正在尝试生成给定字符串的每个可能的子序列,如果子序列与模式ans匹配,则ans将为ans=ans+1

我想记住解决方案,并使用dp优化时间复杂性,但无法思考如何做到这一点

代码:

  • 设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];
}
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];
}