使用一维数组的LCS动态规划

LCS dynamic programming using one dimensional array

本文关键字:LCS 动态规划 一维数组      更新时间:2023-10-16

我正在尝试进行动态编程以查找LCS的长度。我为此使用了二维数组。但是对于大字符串,由于内存溢出,它会给出运行时错误。请告诉我如何在一维数组中执行此操作以避免内存限制。

#include<bits/stdc++.h>
 #include<string.h> 
 using namespace std;
int max(int a, int b);
int lcs( string X, string Y, int m, int n )
{
   int L[m+1][n+1];
   int i, j;
   for (i=0; i<=m; i++)
   {
     for (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];
}
int max(int a, int b)
{
    return (a > b)? a : b;
}
int main()
{
  string X;
  string Y;
  cin>>X>>Y;
  int m = X.size();
  int n = Y.size();
  printf("Length of LCS is %dn", lcs( X, Y, m, n ) );
  return 0;
}

请注意,lcs中的递归仅使用L矩阵的最后两行。因此,您可以轻松地重写解决方案以使用 O(N) 内存。

这是一篇关于这个主题的好文章。

二维数组无论如何都是虚构的,它仍然是一维数组,所以自己计算索引,即:所以你的数组int L[(n+1)(m+1)]和L[i][j]的索引= L[i(n+1)+j]