您的位置:首页 > 其它

最长公共子序列(LCS---动态规划)

2016-08-28 11:09 260 查看

题目描述:求两个字符串的最长公共子序列

 

子序列:字符之间可以不连续
吗 
字串:字符之间必须是连续的

DP最终处理的还是数值(极值做最优解),找到了最优值,就找到了最优方案;为了找到最长的LCS,我们定义dp[i][j]记录序列LCS的长度,合法状态的初始值为当序列X的长度为0或Y的长度为0,公共子序列LCS长度为0,即dp[i][j]=0,所以i和j分别表示序列X的长度和序列Y的长度,状态转移方程为

1.     
dp[i][j] = 0 
如果i=0或j=0

2.     
dp[i][j] = dp[i-1][j-1] + 1 
如果X[i-1] = Y[i-1]

3.     
dp[i][j] = max{ dp[i-1][j], dp[i][j-1] } 
如果X[i-1] != Y[i-1]

主要代码:

class LCS {

public:

    int f
a668
indLCS(string A, int n, string B, int m) {

        // write code here

        //动态规划

        int dp[n+1][m+1];//表示长度是n m字符串的公共子序列长度

       //边界初始化

        for(int i=0;i<n+1;i++)

            dp[i][0]=0;//表示长度为i的字符串(A中连续i个字符,A[0]表示第1个字符)和长度为0的字符串

        for(int j=0;j<m+1;j++)

            dp[0][j]=0;

        //递推关系

        for(int i=1;i<n+1;i++){

            for(int j=1;j<m+1;j++){

                if(A.at(i-1)==B.at(j-1))//i-1   j-1表示在字符串中的位置,注意相同变量意义上的区别

                    dp[i][j]=dp[i-1][j-1]+1;

                else

                    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);

            }

        }

        return dp
[m];//返回结果

   }

};

        

        

        

   }

};


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: