| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1535 人关注过本帖, 1 人收藏
标题:最长公共子序列算法实现出现的问题
只看楼主 加入收藏
diaoxue
Rank: 1
等 级:新手上路
帖 子:142
专家分:0
注 册:2007-6-1
收藏(1)
 问题点数:0 回复次数:9 
最长公共子序列算法实现出现的问题
#include<iostream.h>
void LcsLength(int m,int n,char x[],char y[],int c[8][7],char b[8][7]);
void Lcs(int i,int j,char * x,char b[8][7]);
int main()
{
char x[]={'a','b','c','b','d','a','b'};
char y[]={'b','d','c','a','b','a'};
int xl=7;
int yl=6;
int c[8][7]={0};
char b[8][7]={0};
LcsLength(xl,yl,x,y,c,b);
Lcs(xl,yl,x,b);
return 0;
}
void LcsLength(int m,int n,char x[],char y[],int c[][],char b[][])
{
for(int i=1;i<=m;i++)int c[i][0]=0;
for(int j=1;j<=n;j++)c[0][j]=0;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
if(x[i]==y[j])
{
c[i][j]=c[i-1][j-1]+1;
b[i][j]='x';//xie xiang shang
}
else if(c[i-1][j]>=c[i][j-1])
{
c[i][j]=c[i-1][j];
b[i][j]='u';//up
}
else
{
c[i][j]=c[i][j-1];
b[i][j]='l';//left
}
}
}
void Lcs(int i,int j,char * x,char b[8][7])
{
if(i==0 ||j==0)
cout<<"Null"<<endl;
if(b[i][j]=='x')
{
Lcs(i-1,j-1,x,b);
cout<<x[i];
}
else if(b[i][j]=='u')Lcs(i-1,j,x,b);
else Lcs(i,j=1,x,b);
}
还是参数的问题,大家帮忙看下啊
搜索更多相关主题的帖子: 序列 算法 
2007-10-23 09:52
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
void LcsLength(int m,int n,char x[],char y[],int c[][],char b[][])
写成这样会出错的吧.用二级指针来代替它最好不不过.

倚天照海花无数,流水高山心自知。
2007-10-23 12:03
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
LZ的递归又没有出口.

倚天照海花无数,流水高山心自知。
2007-10-23 12:06
diaoxue
Rank: 1
等 级:新手上路
帖 子:142
专家分:0
注 册:2007-6-1
收藏
得分:0 
递归出口???
不太懂啊
麻烦高手解释下
改下我的程序

上善若水,水善利万物而不争,处众人之所恶
2007-10-23 16:03
eagleboycn
Rank: 1
等 级:新手上路
帖 子:191
专家分:0
注 册:2007-9-26
收藏
得分:0 
void LcsLength(int m,int n,char x[],char y[],int c[][],char b[][])
刚刚看书上面说
函数头如果有多下标数组,只有第一个可以省略
不过二级指针我不了解
刚刚开始学习
^_^

兵法的精要在于韬晦自己
2007-10-23 16:56
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
以下是引用diaoxue在2007-10-23 16:03:48的发言:
递归出口???
不太懂啊
麻烦高手解释下
改下我的程序

就是要有结束递归的语句.


倚天照海花无数,流水高山心自知。
2007-10-23 18:42
diaoxue
Rank: 1
等 级:新手上路
帖 子:142
专家分:0
注 册:2007-6-1
收藏
得分:0 
结束递归可以用break吗
没用过

上善若水,水善利万物而不争,处众人之所恶
2007-10-23 21:21
jonc
Rank: 1
等 级:新手上路
帖 子:69
专家分:0
注 册:2007-3-25
收藏
得分:0 
for(int i=1;i<=m;i++)int c[i][0]=0;
for(int j=1;j<=n;j++)c[0][j]=0;
有意义吗?并且蓝色的也是错误!


菜鸟也想高飞
2007-11-10 11:00
diaoxue
Rank: 1
等 级:新手上路
帖 子:142
专家分:0
注 册:2007-6-1
收藏
得分:0 
回复:(diaoxue)最长公共子序列算法实现出现的问题

二级指针,不行
用int a[][N],听说可以


上善若水,水善利万物而不争,处众人之所恶
2007-11-10 17:03
codelet
Rank: 2
来 自:广东深圳
等 级:论坛游民
帖 子:61
专家分:37
注 册:2007-11-6
收藏
得分:0 

递归返回就是类似于return这样的。

用二级指针比较好。
对于数组的边界处理,是需要程序员来处理的,也即说程序员要知道数组的长度。
在你把一个数组传给一个函数时,你同时需要传递数组的维的大小,
否则函数不知道如何寻址或者直接就寻错址。
在这个算法里面,m 和 n 隐含的表示了c 和 b 的寻址边界,但是如果用
void LcsLength(int m, int n, char x[], char y[],int c[][],int b[][])
的声明形式,你必须指定第二维的长度,这样程序的扩展性就变得非常局促。

如果你用下面的声明方式:
void LcsLength(int m,int n, char* x, char* y, int** c, int** b)
那么你就可以靠m 和 n这两个变量来寻址c[][] 和b[][]。

c 和 b 的定义采用下面这种形式:

int **c, **b;
c = new int*[m];
b = new int*[m];
for( int i = 0; i < m; i++)
{
c[i] = new int[n];
b[i] = new int[n];
}
然后就可以直接调用函数:
LcsLength(xl, yl, x, y, c, b);

(c 和 b 是否得定义成(m + 1)行和(n + 1)列?忘了,回头看书去。。。

[此贴子已经被作者于2007-11-19 12:26:32编辑过]


Losing emotion, Finding devotion.
2007-11-19 10:38
快速回复:最长公共子序列算法实现出现的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032264 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved