动态规划求解最长子序列

问题描述:给定两个序列X={B,C,D,A}Y={A,B,C,B},请采用动态规划策略求出其最长公共子序列,要求给出过程。

解题思想:设序列X={x1,x2,...,xm}Y={x1,x2,...,xn}的最长公共子序列Z={z1,z2,...,zk}

*xm=yn,则zk = xm = yn,且Zk-1Xm-1Yn-1的最长公共子序列。

*xmyn,且zkxm,则ZXm-1Y的最长公共子序列。

*xmyn,且zkyn,则ZXYn-1的最长公共子序列。

子问题的递归结构:用c[i][j]记录序列XiYj的最长公共子序列的长度,则

动态规划求解最长子序列_第1张图片

代码:

#include 
#include 
#include 
using namespace std;


void LCSLength(int m, int n, char *x, char *y, int **c, int **b)
{
    int i, j;
    for(i = 0; i <= m; i++) c[i][0] = 0;
    for(i = 0; i <= n; i++) c[0][i] = 0;
    for(i = 1; i <= m; i++)
        for(j = 1; j <= n; j++)
    {
        if(x[i-1] == y[j-1])
        {
            c[i][j] = c[i-1][j-1]+1;
            b[i][j] = 0;
        }
        else if(c[i-1][j] >= c[i][j-1])
        {
            c[i][j] = c[i-1][j];
            b[i][j] = 1;
        }
        else{
            c[i][j] = c[i][j-1];
            b[i][j] = -1;
        }
    }
    cout<

结果:

动态规划求解最长子序列_第2张图片


 

你可能感兴趣的:(C++)