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;
}
结果如图: