动态规划算法——求最长公共子序列详解

前言

最近学习软考大题里有个求最长公共字序列的题,运用的就是动态规划的算法,经过我们小组学习对动态规划有了一定的认识,下面我对动态规划的代码做一个详解!

什么是最长公共子序列

我举个例子大家就明白。 例如:对序列 1,3,5,4,2,6,8,7来说,序列3,4,8,7 是它的一个子序列。对于一个长度为n的序列,它一共有2^n 个子序列,有(2^n – 1)个非空子序列。在这里需要提醒大家,子序列不是子集,它和原始序列的元素顺序是相关的。

关键代码

下面是关键代码,主要看后面三个IF,也是这个这段代码的核心!

void LCS(char *x, char *y,int x_len, int y_len, int common_len[][MAX], int b[][MAX])
{
    //common_len[i][j]存储的是x的第i位与有的第j位的公共子序列的长度
    //b[i][j] 记录获得common_len[i][j]的路径:分别为0 -1 1,便于回溯输出公共子串

    int i,j;
    
    for (i = 0; i < x_len; i++)              //初始化地图
        common_len[i][0] = 0;
        
    for (j = 0; j < y_len; j++)             //初始化地图
        common_len[0][j] =0;

    for (i = 1; i <= x_len; i++)           //循环行
    {
        for (j = 1; j <= y_len; j++)        //循环列
        {
            if (x[i-1] == y[j-1])       //比较两个数组里的值是否相同
            {
                common_len[i][j] = common_len[i-1][j-1] + 1;     //相同的话,就等于左上角的值加1
                b[i][j] = 0;                                     //0 代表指向左上方的箭头
            }
            else if (common_len[i-1][j] >= common_len[i][j-1])     //如果common_len[i][j]的上面大于左边
            {
                common_len[i][j] = common_len[i-1][j];    //这个值就等于上面的值
                b[i][j] = 1;                              //1  代表指向上方的箭头
            }
            else
            {
                common_len[i][j] = common_len[i][j-1];     //否则等于左边的值
                b[i][j] = 2;                               //2  代表指向左边的箭头
            }
        }
    }
}

总结

代码片段我标注了注释,大家有什么不懂或者疑惑,欢迎下方留言,多多交流,相互学习!!

你可能感兴趣的:(动态规划算法——求最长公共子序列详解)