动态规划 最长公共子序列

来源:互联网 发布:中国近几年进出口数据 编辑:程序博客网 时间:2024/05/01 14:33

设有字符串a[0...n],b[0...m],下面就是递推公式。字符串a对应的是二维数组num的行,字符串b对应的是二维数组num的列。



//代码实现比较简单,可能有问题   #include <iostream>   #include <string>   using namespace std;   int main(int argc, char **argv)   {   string str1 = "ABCBDABEFG";   string str2 = "BDCABAEFG";   int x_len = str1.length();  int y_len = str2.length();  int arr[50][50] = {{0,0}};  int i = 0;  int j = 0;  for(i = 1; i <= x_len; i++)  {  for(j = 1; j <= y_len; j++)  {  if(str1[i - 1] == str2[j - 1])  { arr[i][j] = arr[i - 1][j - 1] + 1;  }  else  {  if(arr[i][j - 1] >= arr[i - 1][j])  {  arr[i][j] = arr[i][j - 1];  }  else  {  arr[i][j] = arr[i -1][j];  }  }  }  }     for(i = 0 ; i <= x_len; i++)     {         for( j = 0; j <= y_len; j++)         {             cout << arr[i][j] << "  ";         }         cout << endl;     }     for(i = x_len, j = y_len; i >= 1 && j >= 1;)     {             if(str1[i - 1] == str2[j - 1])             {                 cout << str1[i - 1] << " ";//倒序打印的                 i--;                 j--;             }             else             {             //  if(arr[i][j -1] >= arr[i - 1][j])//打印:B A D B                 if(arr[i][j -1] > arr[i - 1][j]) //打印:A B C B                 {                     j--;                 }                 else                 {                     i--;                 }             }     }     cout << endl;     return 0; }


0 0