如何解决更好的运行时间? - C - LCS - 两个序列的最长公共子序列
我编写了一个程序来使用动态规划和 DP 数组查找 LCS(最长公共子序列)。 Coursera 说它不够快。有什么方法可以改进吗?
我已经尽力简化它了。欢迎任何建议。
a & b 是两个不同的数列数组。
i & j 是 a & b 的索引。
n & m 显示每个序列中有多少个数字。
dp[][] 是一个用于记忆的数组。
#include <stdio.h>
#include <stdlib.h>
int lcs2(int a[],int b[],int i,int j,int n,int m,int dp[n+1][m+1]) {
int counter = 0;
while(i < n && j < m){
if (dp[i][j] != 0) //1.0 return stored ans if exist
return dp[i][j];
//2.0 no stored result,run below
else if (a[i] == b[j]){ //2.1 check if both digits are the same
counter++; //2.1.1 update counter
i++; //2.1.2 both i & j move forward
j++;
}
else { //2.2 both int are not the same
//2.2.1 check the next best move
int ans1 = lcs2(a,b,i+1,j,n,m,dp); //when i+1
int ans2 = lcs2(a,i,j+1,dp); //when j+1
if (ans1 >= ans2){ //2.2.2 compare and move
i++;
}
else { //2.2.2
j++;
}
}//else ends
}
dp[i][j] = counter;
return counter;
}
int main() {
int n;
scanf("%d",&n);
int a[n];
for (int i = 0; i < n; i++) {
scanf(" %d",&a[i]);
}
int m;
scanf("%d",&m);
int b[m];
for (int i = 0; i < m; i++) {
scanf(" %d",&b[i]);
}
int dp[n+1][m+1]; //length +1
for (int i = 0; i < n; i++){
for (int j = 0; j < m; j++){
dp[i][j] = 0;
}
}
printf("%d\n",lcs2(a,dp));
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。