使用一维数组的LCS动态规划
LCS dynamic programming using one dimensional array
我正在尝试进行动态编程以查找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]
相关文章:
- 如何解决动态规划问题?
- 动态规划中的旅行推销员问题
- 返回不停止函数,递归函数问题?(编程练习,动态规划,Levenshtein 回溯)
- 寻找最小楼梯成本的动态规划问题的错误答案
- 自上而下的动态规划与递归朴素解决方案.检查运行时执行
- 动态规划 - 原始计算器
- 如何通过动态规划方法解决这个问题?
- C++ 返回具有最小硬币的数组/向量以获得价值动态规划
- 动态规划 - 在数组中查找目标求和方式
- 转换为动态规划算法
- 我的记忆动态规划算法有什么问题?
- 使用动态规划在矩阵中的所有可能路径中具有最小总和的打印路径
- 动态规划:计算集合中存在多少个升序子集
- 错误 C2106:'=':左操作数必须是斐波那契数列中的 l 值,方法是动态规划 C++
- 使用动态规划的值无关背包问题
- 如何知道棒切割算法中杆的所有切割长度?(动态规划)
- 使用一维数组的LCS动态规划
- 动态规划,遍历方法
- 使用动态规划的 TSP
- 动态规划中LCS比较数的求解