生活随笔
收集整理的這篇文章主要介紹了
动规最长公共子序列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先,有倆參數分別是s1,s2,那就要用二維數組.
確定狀態maxlen(i,j),表示s1第i個與s2第j個元素組成的最長公共子序列個數
再找臨界狀態:maxlen(i,0)=0,maxlen(0,j)=0
再找狀態轉移方程:
如果s1第i-1個元素和s2第i-1個元素相等,那么maxlen(i,j)=maxlen(i-1,j-1)+1
如果s1第i-1個元素和s2第i-1個元素不相等那么maxlen(i,j)=max(maxlen(i,j-1)+maxlen(i-1,j))
最后輸出maxlen(len1,len2)就可以了
#include<iostream>
#include<cstring>
using namespace std;
char sz1[
1000] ;
char sz2[
1000];
int maxlen[
1000][
1000];
int main(){
while(
cin>>sz1>>sz2){
int length1=
strlen( sz1);
int length2=
strlen( sz2);
int ntmp;
int i,j;
for(i =
0;i <= length1;++i) maxlen[i][
0]=
0;
for(j=
0;j<=length2;++j)maxlen[
0][j]=
0;
for(i=
1;i<=length1;i++){
for(j=
1;j<=length2;j++){
if(sz1[i-
1]==sz2[j-
1])maxlen[i][j]=maxlen[i-
1][j-
1]+
1;
else maxlen[i][j]=max(maxlen[i-
1][j],maxlen[i][j-
1]);} }
cout<<maxlen[length1][length2]<<endl;}
return 0;
}
總結
以上是生活随笔為你收集整理的动规最长公共子序列的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。