2序列比对问题

来源:互联网 发布:极光中文安卓编程 编辑:程序博客网 时间:2024/04/30 13:19

str1=abdad

str2=bacd

两字符串进行序列比对,定义一个可以用来衡量比对性能的得分函数

令f(x,y)表示x与y比对的得分。假设x和y都是字符,如果x与y相同,那么f(x,y)=2,如果x与y不同,那么f(x,y)=1,如果x或y是“-”,那么f(x,y)=-1。

str1和str2的2序列比对问题是找到具有最多得分的两序列比对。


状态公式:

A(0,0)=0;

A(i,0)=0;

A(0,j)=0;

A(i,j)=max{

                        (A(i-1,j)+f(a(i),-)),

                        (A(i-1,j-1)+f(a(i),b(j))),

                        (A(i,j-1)+f(-,b(j)))

                      };


代码如下

//动态规划 #include<iostream> #include<cstring>using namespace std;  const int MAX=1000;    int maxLen[MAX][MAX];  int main(){  int i,j;  string str1,str2;  cin>>str1>>str2;  memset(maxLen,0,sizeof(maxLen));for(i=0;i<=str1.length();++i){maxLen[0][i]=0-i;} for(i=0;i<=str2.length();++i){maxLen[i][0]=0-i;} for(i=1;i<=str2.length();++i){  for(j=1;j<=str1.length();++j){int temp=max(maxLen[i-1][j]-1,maxLen[i][j-1]-1);int step=0;if(str1[j-1]==str2[i-1])step=2;else step=1;temp=max(temp,maxLen[i-1][j-1]+step);maxLen[i][j]=temp; }  }  for(i=0;i<=str2.length();++i){for(j=0;j<=str1.length();++j){cout<<maxLen[i][j]<<"\t"; }cout<<endl;}cout<<maxLen[str2.length()][str1.length()]<<endl;  return 0;  }   

//深度搜索遍历 #include<iostream> #include<cstring>using namespace std;  string str1,str2;//输入的字符串 int maxResult=0;//最大2序列比对 void dfs(int pos1,int pos2,int score){if(pos1==str1.length()){score-=(str2.length()-pos2);if(score>maxResult)maxResult=score;return ;}if(pos2==str2.length()){score-=(str1.length()-pos1);if(score>maxResult)maxResult=score;return ;}if(str1[pos1]==str2[pos2]){ dfs(pos1+1,pos2+1,score+2);}else{dfs(pos1+1,pos2+1,score+1);}dfs(pos1,pos2+1,score-1);dfs(pos1+1,pos2,score-1);return ;}int main(){  cin>>str1>>str2;dfs(0,0,0);cout<<maxResult<<endl;  return 0;  }

结果如图: