1. 程式人生 > >動態規劃求解最長公共子序列的C++演算法實現

動態規劃求解最長公共子序列的C++演算法實現

#include<iostream> using namespace std; int CommonOrder(char x[] ,int m ,char y[], int n, char z[]) {     int i,j,k;     int L[10][10],S[10][10];      for(j=0;j<=n;j++)         L[0][j] = 0;     for(i=0;i<=m;i++)         L[i][0] = 0;     for(i=1;i<=m;i++)         for(j=1;j<=n;j++)         {             if(x[i-1]==y[j-1])             {                 L[i][j] = L[i-1][j-1]+1;    //如果x[i-1]==y[j-1],那麼L[i][j]的值為其最近的左對角線元素的值加一                  S[i][j] = 1;             }             else if(L[i][j-1]>=L[i-1][j])   //如果 L[i][j-1]>=L[i-1][j]即 L[i][j]左邊相鄰的元素大於等於上方相鄰的                                                         {                                //元素,則該元素的值取左方相鄰元素的值                 L[i][j] = L[i][j-1];                 S[i][j] = 2;             }                 else                            //如果x[i-1]==y[j-1]且L[i][j-1]<L[i-1][j],則 L[i][j]的值為其上方的值              {                 L[i][j] = L[i-1][j];                 S[i][j] =3;             }         }     for(j=0;j<=m;j++)         {         for(i=0;i<=n;i++)             cout<<L[j][i];         cout<<endl;     }     i=m;j=n;k=L[m][n];     while(i>0 && j>0)     {         if(S[i][j] == 1)         {             z[k] = x[i];             k--;             i--;             j--;         }         else if(S[i][j] == 2)             j--;         else              i--;     }     for(k=0;k<L[m][n];k++)         cout<<z[k];     cout<<endl;     return L[m][n];     }

int main() {     char x[]={'a','b','c','b','d','b'};     char y[]={'a','c','b','b','a','b','d','b','b'};     char b[50];     cout<<"最長子序列的長度為:"<<CommonOrder(x,6,y,9,b); }