zoukankan      html  css  js  c++  java
  • 动态规划之LCS(最大公共子序列)

    #include <stdio.h>
    #include <string.h>
    
    int b[50][50];
    int c[50][50];
    int length = 0;
    
    void lcs(char *x, int m, char *y, int n)
    {
        int i;
        int j;
    
        for(i = 1; i <= m; i++)
            c[i][0] = 0;
    
        for(i = 1; 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] = 1;
                }
                else if(c[i-1][j] > c[i][j-1])
                {
                    c[i][j] = c[i-1][j];
                    b[i][j] = 2;
                }
                else
                {
                    c[i][j] = c[i][j-1];
                    b[i][j] = 3;
                }
            }
        }
    }
    
    void show(int i, int j, char *x)
    {
        if(i == 0 || j ==0)
            return;
    
        if(b[i][j] == 1)
        {
            show(i-1, j-1, x);
            length++;
            printf("%c", x[i-1]);
        }
        else if(b[i][j] == 2)
        {
            show(i-1, j, x);
        }
        else
        {
            show(i, j-1, x);
        }
    }
    
    int main()
    {
        char *x = "xyzrfdt";
        char *y = "xzhrgfiut";   //xzrft
    
        int m = strlen(x);
        int n = strlen(y);
        lcs(x,m,y,n);
    
        printf("The string is: 
    ");
        show(m, n, x);
    }
     1 #include <iostream>
     2 #include <string>
     3    using namespace std;
     4    int main(int argc, char **argv)
     5    {
     6        string str1 = "ABCBDAB";
     7        string str2 = "BDCABA";
     8 
     9        int x_len = str1.length();
    10       int y_len = str2.length();
    11 
    12       int arr[50][50] = {{0,0}};
    13 
    14       int i = 0;
    15       int j = 0;
    16 
    17       for(i = 1; i <= x_len; i++)
    18       {
    19           for(j = 1; j <= y_len; j++)
    20           {
    21               if(str1[i - 1] == str2[j - 1])
    22               {
    23                  arr[i][j] = arr[i - 1][j - 1] + 1;
    24               }
    25               else
    26              {
    27 
    28                   if(arr[i][j - 1] >= arr[i - 1][j])
    29                   {
    30                       arr[i][j] = arr[i][j - 1];
    31                   }
    32                   else
    33                   {
    34                       arr[i][j] = arr[i -1][j];
    35                   }
    36               }
    37 
    38           }
    39       }
    40      for(i = 0 ; i <= x_len; i++)
    41      {
    42          for( j = 0; j <= y_len; j++)
    43          {
    44              cout << arr[i][j] << "  ";
    45          }
    46          cout << endl;
    47      }
    48      for(i = x_len, j = y_len; i >= 1 && j >= 1;)
    49      {
    50              if(str1[i - 1] == str2[j - 1])
    51              {
    52                  cout << str1[i - 1] << " ";//倒序打印的
    53                  i--;
    54                  j--;
    55              }
    56              else
    57              {
    58              //  if(arr[i][j -1] >= arr[i - 1][j])//打印:B A D B
    59                  if(arr[i][j -1] > arr[i - 1][j]) //打印:A B C B
    60                  {
    61                      j--;
    62                  }
    63                  else
    64                  {
    65                      i--;
    66                  }
    67              }
    68      }
    69      cout << endl;
    70      return 0;
    71  }
    C++

    运行结果:

     

  • 相关阅读:
    互操作
    Rx基础
    数据流块基础
    C# 一个帮您理解回调函数的例子(新手必看)
    C# 多线程之通过Timer开启线程的例子
    C# 利用委托事件进行窗体间的传值(新手必看)
    C#XML文件操作随笔
    C# 委托学习笔记
    c# 关于抓取网页源码后中文显示乱码的原因分析和解决方法
    c# 异步编程 使用回调函数例子
  • 原文地址:https://www.cnblogs.com/CoolRandy/p/3648977.html
Copyright © 2011-2022 走看看