#include<iostream>
#include<string.h>
int count=0;
using namespace std;
int max(int a,int b)
{
return (a>b)?a:b;
}
int lcs(char *x,char*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 main()
{
char x[]="AGGTAB";
char y[]="GXTXAYB";
int m=strlen(x);
int n=strlen(y);
cout<<"The Length Of the Longest Common Subsequence Is : "<<lcs(x,y,m,n);
}
上述程序用于使用动态编程查找最大公共子序列解决方案。 我能够计算LCS的长度,但我无法推断出找到总数的逻辑。比较系统将找到lcs。
我想找到总数没有。比较和使用全局计数变量打印它。有人可以帮帮我吗?
答案 0 :(得分:0)
这取决于您的确切比较。
我认为,相比之下,你的意思是“比较字符串中的字符”。即i==0
不计算为比较。同时比较max
中的值也不算作比较,因为不比较字符串中的字符。此外,我没有通过你的程序检查你所做的事情是否真的正确 - 我只是假设它是并且专注于你的实际问题。
话虽如此,正在发生的唯一字符比较是:
else if(x[i-1]==y[j-1])
因此,每次执行此检查时,都应增加计数器。一种方法是重新构建分支(而不是else if
你可以做else{ if{x[i-1]==y[j-1]} }
。如果你这样做,那么你可以在counter
之前增加if(){
}else{
counter++;
if{x[i-1]==y[j-1]}
}else{
}
}
。如果。喜欢这样:
bool compareChars(char &first, char &second){
counter++;
return first == second;
}
另一种更明确的方法是让函数在那里进行检查和增量。类似的东西:
else if(compareChars(x[i-1], y[j-1]))
然后你会这样做:
DECLARE @tbl TABLE( b varchar(100),l1 varchar(100),l2 varchar(100),l3 varchar(100), l4 varchar(100));
INSERT INTO @tbl VALUES
('a','b1','c1','d1','e1')
,('d','x1','y1',null,null);
SELECT u.v.value('.','varchar(max)')
FROM
(
SELECT '' + b + l1 + l2 + l3 + l4 + ';' AS x
,'' + b + l1 + l2 + l3 + ';' AS x
,'' + b + l1 + l2 + ';' AS x
,'' + b + l1 + ';' AS x
FROM @tbl
FOR XML PATH(''),TYPE
) AS XMLList(x)
CROSS APPLY XMLList.x.nodes('/x') AS a(b)
CROSS APPLY(SELECT CAST('<r>' + REPLACE(a.b.value('.','varchar(max)'),';','</r><r>') + '</r>' AS XML)) AS m(n)
CROSS APPLY m.n.nodes('/r') AS u(v)
WHERE LEN(u.v.value('.','varchar(max)'))> 0
/* Result
ab1c1d1e1
ab1c1d1
ab1c1
ab1
dx1y1
dx1
*/
然后非常明显的是,每次进行比较时,计数器都会递增。
我没有对此进行彻底的测试,当然其他方法也可以,但我希望你能得到一个粗略的想法。