動態規劃求解最長公用子序列

來源:互聯網
上載者:User

標籤:

動態規划算法與分治法類似,其基本思想也是將待求解問題分解成若干個子問題,先求解子問題,然後從這些子問題的解得到原問題的解。與分治法不同的是,適合於用動態規劃求解的問題,經分解得到的子問題往往不是互相獨立的。若用分治法來解決這類問題,則分解得到的子問題數目太多,以至於最後解決原問題需要耗費指數時間。然而,不同子問題的數目常常只有多項式量級。在用分治法求解時,有些子問題被重複計算了許多次。如果我們能夠儲存已解決的子問題的答案,而在需要時再找出已求得的答案,這樣就可以避免大量的重複計算,從而得到多項式時間演算法。為了達到此目的,可以用一個表來記錄所有已解決的子問題的答案。不管子問題以後是否被用到,只要它被計算過,就將其結果填入表中。這就是動態規劃的基本思想。

動態規划算法適用於解決最佳化問題。通常可以按以下4個步驟設計:(1)找出最優解的性質,並刻畫其結構特徵。(2)遞迴地定義最優值。(3)以自底向下的方式計算出最優值。(4)根據計算最優值時得到的資訊,構造最優解。

以下是求解最長公用子序列的演算法:

#include<iostream>
#include<string>
#define N 20
using namespace std;
int d[N][N];
int LCSlength(char *a,char *b,int c[][N])
{
int alen=strlen(a);
int blen=strlen(b);
for(int i=0;i<=alen;i++)
c[i][0]=0;
for(int j=0;j<=blen;j++)
c[0][j]=0;
for(i=1;i<=alen;i++)
for(j=1;j<=blen;j++)
if(a[i-1]==b[j-1])
c[i][j]=c[i-1][j-1]+1;
else
c[i][j]=c[i][j-1]>c[i-1][j]?c[i][j-1]:c[i-1][j];
return c[alen][blen];
}
char *LCS(char *s,char *a,char *b)
{
int c[N][N];
int i=strlen(a);
int j=strlen(b);
int k=LCSlength(a,b,c);
s[k]=‘\0‘;
while(k>0)
{
if(c[i][j]==c[i-1][j])
i--;
else if(c[i][j]==c[i][j-1])
j--;
else
{
s[--k]=a[i-1];
i--;
j--;
}
}
return s;
}
void main()
{
char *s=new char[N];
char s1[N];
char s2[N];
cout<<"請輸入第一個字串:";
cin>>s1;
cout<<"請輸入第二個字串:";
cin>>s2;
cout<<"最長的公用子序列為:"<<LCS(s,s1,s2)<<endl;
delete s;
cout<<"長度為" <<LCSlength(s1,s2,d)<<endl;
}

 

動態規劃求解最長公用子序列

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.