动态规划解最长公共子序列问题bug

昨天写动态规划解最长公共子序列问题是出错了,纠结了我一天,浪费了好多时间。问题是这样的,源代码:
<span style="color:#323e32;">#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
using namespace std;

int a[1001][1001];
char s1[1000],s2[1000];

int max(int x,int y)
{
if(x>y)
return x;
else
return y;
}

int main()
{

int k,i;
cin>>k;
for(i=0;i
{
cin>>s1;
cin>>s2;
int long1=strlen(s1);
int long2=strlen(s2);
int i,j;
for(i=0;i<=long1;i++)
a[0][i]=0;
for(j=0;j<=long2;j++)
a[j][0]=0;
for(i=1;i<=long1;i++)
{
for(j=1;j<=long2;j++)
{
</span><span style="color:#ff0000;">if(s1[j-1]==s2[i-1])</span><span style="color:#323e32;">
a[j][i]=a[j-1][i-1]+1;
else
a[j][i]=max(a[j-1][i],a[j][i-1]);
}
}
cout<<a[long2][long1]<<endl;
}
return 0;
}</span>
这是运行结果,就是有时计算出的最长公共子序列长度少1,照着别人的正确代码改了半天都没发现错误,后来才发现是上面代码的红字部分,i和j的位置放反了。
首先从知识的角度来说,有几个问题:
1.对于数组的行列关系和赋值方式没有弄得很清楚
2.对于字符串和数组之间对应的逻辑关系也没想清楚
这里应该明白首先有两个字符串s1和s2,他们的长度分别是long1和long2,然后我们现在需要建立一个二维数组来记录每个字符串各个前缀序列间的公共子序列长度,也就是要建立一个array[long1][long2]形式的数组,二维数组的第一个参数表示的是行数,第二个参数表示的是列数,这个数组的行数也就对应着s1的各个字符,这个数组的列数也就对应着s2的各个字符,然后给数组赋值时,也就要根据s1[i]和s2[j]是否相等来给array[i+1][j+1]赋值,而我的程序正好反了,还是要把每个变量和数字对应的东西搞清楚;还有就是给二维数组赋值是一个两层嵌套的循环,我们要清楚第一层循环是0到long1,对应的是s1的每个前序列,i表示的是二维数组的行数,第二层循环是0到long2,对应的是s2的每个前序列,j表示的是二维数组的列数,可能就是因为问题一复杂,又加上什么循环之类的就搞错了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值