亚洲免费乱码视频,日韩 欧美 国产 动漫 一区,97在线观看免费视频播国产,中文字幕亚洲图片

      1. <legend id="ppnor"></legend>

      2. 
        
        <sup id="ppnor"><input id="ppnor"></input></sup>
        <s id="ppnor"></s>

        2017年計算機等級考試二級C++輔導:最長公共子序列

        字號:


            一、算法思想
            一個給定序列的子序列是在該序列中刪去若干元素后得到的序列。給定兩個序列X和Y,當另一序列Z既是X的子序列又是Y的子序列時,稱Z是序列X 和Y的公共子序列。最長公共子序列就是求給定兩個序列的一個最長公共子序列。動態(tài)規(guī)劃可以有效的解決此問題。由最長公共子序列問題的子序列的子結(jié)構(gòu)性質(zhì),可以建立子問題的遞歸關(guān)系。用c[i][j]記錄序列Xi和Yi的最長公共子序列的長度,遞歸關(guān)系如下:
            0 i=0,j=0
            c[i][j]= c[i-1][j][j-1]+1 i,j> 0;xi==yj
            max c[i][j-1],c[i-1][j] I,j> 0;xi==yj
            在具體的算法設(shè)計中,以序列X= { x1,x2,x3,…,xm }和Y= {y1,y2,y3,…,ym}作為輸入。輸出三個數(shù)組c,b,temp。其中c[i][j]存儲Xi和Yj的公共子序列的長度,b[i][j]記錄c[i][j]的值是由哪一個子問題的解得到的,這在構(gòu)造最長公共子序列時要用到。問題得解,即X和Y得最長公共子序列記錄在temp[h]中。
            二、源代碼
            下面是在Microsoft Visual C++ 6.0中編寫的求最長公共子序列的源程序,程序定義了得字符串長度為99,是將p48頁的動態(tài)規(guī)劃算法改寫而來的。
            #include
            #include
            #define MAX 99
            //typedef char MM;
            void main()
            { int i,j,m,n,h=0;
            char x[MAX]={ ' ', ' '},y[MAX]={ ' ', ' '},b[MAX][MAX]={ ' '};
            int c[MAX][MAX]={0};
            char temp[MAX]={ ' '};
            cout < < "**本程序可以求得字符數(shù)在99以內(nèi)的任意兩個字符串的公共子序列**\n ";
            cout < < "請輸入第一個字符串的長度m= ";
            cin> > m;
            cout < < "請輸入第一個字符串(“回車”結(jié)束)\n如果輸入的字符數(shù)超過m,則會出錯!\nx[ " <
            for(i=1;i <=m;i++)
            cin> > x[i]; //鍵盤輸入x和y
            cout < < "請輸入第二個字符串的長度n= ";
            cin> > n;
            cout < < "請輸入第二個字符串\ny[ " <
            for(i=1;i <=n;i++)
            cin> > y[i];
            for(i=1;i <=m;i++)c[i][0]=0; //動態(tài)規(guī)劃開始
            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]==y[j])
            {c[i][j]=c[i-1][j-1]+1;
            b[i][j]= '\\ ';
            }else
            if(c[i-1][j]> =c[i][j-1])
            { c[i][j]=c[i-1][j];
            b[i][j]= '│ ';
            }else{c[i][j]=c[i][j-1];
            b[i][j]= '- ';
            }
            } //動態(tài)規(guī)劃結(jié)束
            cout < < "c[m][n]中的內(nèi)容:\n ";
            for(i=0;i <=m;i++)
            {for(j=0;j <=n;j++)
            cout <
            cout <
            }
            cout < < "b[m][n]中的內(nèi)容:\n ";
            for(i=1;i <=m;i++)
            {for(j=1;j <=n;j++)
            cout <
            cout <
            }
            i=m,j=n;
            while(1)
            {if(i==0││j==0) break;
            if(b[i][j]== '\\ '){
            temp[h++]=x[i]; //反序記錄最長公共子序列到temp中
            i=i-1,j=j-1;
            }
            else
            if(b[i][j]== '│ ')
            i=i-1;
            else
            j=j-1;}
            cout < < "\nx[ " <
            for(i=h-1;i> =0;i--) //格式化輸出最長公共子序列
            if(i==h-1)
            if(h==1)
            cout < < "LCS: < " <
            else
            cout < < "LCS: < " <
            else
            if(i==0)
            cout < < ", " <
            else
            cout < < ", " <
            cout < < "\n " <
            }
            三、運算結(jié)果
            其實它的最長公共子序列不止一個,這里只輸出了其中的一個。
            四、總結(jié)分析
            在這個具體的算法中,還有可以改進的地方,比如在具體的求公共子序列中,可以不必要MAX的宏定義,只需將各數(shù)組設(shè)為具體的長度就可以節(jié)約不少的空間,大大降低程序的空間復雜度,但是為了鍵盤輸入任意字符串,犧牲了很多的內(nèi)存空間。在鍵盤輸入字符串時,可以不用循環(huán)賦值,直接用 cin> > x;cin> > y;這樣就可以將這部分的時間復雜度從O(m+n)降到O(2),但有一個相關(guān)的問題沒解決,所以我沒這樣賦值。程序總的時間復雜度為:O(mn+3m+ 3n).