如何定义一个记忆表

时间:2018-11-02 01:56:51

标签: algorithm dynamic-programming memoization

[更早提出类似的问题,但删除了先前的问题并已更改的问题]

对于以下问题程序,必须提供动态编程的解决方法,记忆表的定义,最佳情况和递归步骤。

给定一个长度为n的字符串,子序列是从左到右读取的任何非空字符子集。例如,如果A = atc,则atcattcac,{{1} }是atc的所有子序列。给定两个长度为An的字符串,请设计一种算法,该算法输出两个字符串的最长公共子序列(LCS)的长度。

我想出了以下方法:

m

接下来的三个步骤我还是有点模糊。

据我了解,记忆表可以定义为:

int lcs( char[] X, char[] Y, int m, int n ) 
  { 
    int L[][] = new int[m+1][n+1]; 

    /* Following steps build L[m+1][n+1] in bottom up fashion. Note 
         that L[i][j] contains length of LCS of X[0..i-1] and Y[0..j-1] */
    for (int i=0; i<=m; i++) 
    { 
      for (int j=0; j<=n; j++) 
      { 
        if (i == 0 || j == 0) 
            L[i][j] = 0; 
        else if (X[i-1] == Y[j-1]) 
            L[i][j] = L[i-1][j-1] + 1; 
        else
            L[i][j] = max(L[i-1][j], L[i][j-1]); 
      } 
    } 
  return L[m][n]; 
  } 

最好的情况是

memo[i][j] = length of longest substring

递归步骤将是

memo[i][j] = 1

这是了解记忆如何工作的正确方法吗?

0 个答案:

没有答案