编程实践

  1. LCS的关键代码
    1. 初始化横竖两条边均为零
    2. 当Xi和Yj相等时,矩阵[i][j]的值为左上角的值加一
    3. 否则,矩阵[i][j]的值为左边和上边值中的较大值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>

using namespace std;

static const int N =100;

int main()
{
freopen("in.txt","r",stdin);
string s1,s2;
// char s1[10],s2[10];
int k;

cin >> k;
for(int i = 0; i < k; i++){
cin >> s1 >> s2;
int c[N+1][N+1];
//string :: size_type m,n;
int m,n;
m = s1.size();
n = s2.size();
// m = strlen(s1);
// n = strlen(s2);
int maxl = 0;
s1 = ' ' + s1;
s2 = ' ' + s2;
c[0][0] = 0;
for(int i = 1; i <= m; i++){//注意此时是从1开始的
c[i][0] = 0;
}
for(int j = 1; j <= n; j++){
c[0][j] = 0;
}
for(int i =1; i <= m; i++){
for(int j = 1; j <= n; j++){
if(s1[i] == s2[j]){
c[i][j] = c[i-1][j-1] + 1;
}else{
c[i][j] = max(c[i-1][j],c[i][j-1]);
}
maxl = max(maxl,c[i][j]);
}
}


// cout << lcs_test(s1,s2) << endl;
cout << maxl<< endl;

}
return 0;
}

##
最长公共子序列
当N 设置为1000时,总是会出现莫名其妙的报错

报错提示:Process returned -1073741571 (0xC00000FD)

代表堆栈溢出,很可能的原因就是开辟的数组空间太大,

百思不得其解之后,将N改为100马上编译通过

LCS的关键代码

1
2
3
4
5
6
for(int i = 1; i <= m; i++){//注意此时是从1开始的
c[i][0] = 0;
}
for(int j = 1; j <= n; j++){
c[0][j] = 0;
}

初始化横竖两条边均为零

1
2
3
4
5
6
7
8
9
10
for(int i =1; i <= m; i++){
for(int j = 1; j <= n; j++){
if(s1[i] == s2[j]){
c[i][j] = c[i-1][j-1] + 1;
}else{
c[i][j] = max(c[i-1][j],c[i][j-1]);
}
maxl = max(maxl,c[i][j]);
}
}

当Xi和Yj相等时,矩阵[i][j]的值为左上角的值加一

否则,矩阵[i][j]的值为左边和上边值中的较大值


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 583614868@qq.com

文章标题:编程实践

文章字数:448

本文作者:钟帅豪

发布时间:2019-09-03, 06:52:29

最后更新:2019-09-16, 16:51:19

原始链接:http://jhshz520.github.io/2019/09/03/编程实践/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏