查找LCS中的比较数量在动态编程中

时间:2015-10-15 15:18:47

标签: c++ data-structures dynamic-programming lcs

#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。

我想找到总数没有。比较和使用全局计数变量打印它。有人可以帮帮我吗?

1 个答案:

答案 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

*/

然后非常明显的是,每次进行比较时,计数器都会递增。

我没有对此进行彻底的测试,当然其他方法也可以,但我希望你能得到一个粗略的想法。