标签:lap one opened none class 为我 思路 using close
题意:给出两个序列,让我们进行配对,配对的时候,我们可以在其中加空数;两个序列都可以
题意给出每种配对的权值,让我们求如何配对权值最大
思路:我们先预处理出配对的权值情况,再预处理出当两个序列各自没开始匹配,而另外一个序列匹配的多少个空数的情况
为何?因为我们从1开始,需要以0这个情况为基准
然后,我们就开始跑dp,有3种情况,详情写在代码中
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e3+10; 4 const int tab[5][5]= 5 { 6 {5,-1,-2,-1,-3}, 7 {-1,5,-3,-2,-4}, 8 {-2,-3,5,-2,-2}, 9 {-1,-2,-2,5,-1}, 10 {-3,-4,-2,-1,0} 11 }; 12 int la,lb; 13 std::string sa,sb; 14 int a[N],b[N]; 15 int dp[N][N]; 16 int main() 17 { 18 std::cin>>la>>sa>>lb>>sb; 19 for(int i=1;i<=la;i++) for(int j=1;j<=lb;j++) dp[i][j]=-2e8; 20 for(int i=1;i<=la;i++){ 21 if(sa[i-1]==‘A‘) a[i]=0; 22 if(sa[i-1]==‘C‘) a[i]=1; 23 if(sa[i-1]==‘G‘) a[i]=2; 24 if(sa[i-1]==‘T‘) a[i]=3; 25 } 26 for(int i=1;i<=lb;i++){ 27 if(sb[i-1]==‘A‘) b[i]=0; 28 if(sb[i-1]==‘C‘) b[i]=1; 29 if(sb[i-1]==‘G‘) b[i]=2; 30 if(sb[i-1]==‘T‘) b[i]=3; 31 } 32 for(int i=1;i<=la;i++) dp[i][0]=dp[i-1][0]+tab[a[i]][4]; 33 for(int i=1;i<=lb;i++) dp[0][i]=dp[0][i-1]+tab[b[i]][4]; 34 for(int i=1;i<=la;i++) 35 for(int j=1;j<=lb;j++){ 36 dp[i][j]=max(dp[i][j],dp[i][j-1]+tab[b[j]][4]); //b序列配对a序列空 37 dp[i][j]=max(dp[i][j],dp[i-1][j]+tab[a[i]][4]); //a序列配对b序列空 38 dp[i][j]=max(dp[i][j],dp[i-1][j-1]+tab[a[i]][b[j]]); //a,b序列当前位置互相匹配 39 } 40 printf("%d",dp[la][lb]); 41 return 0; 42 }
标签:lap one opened none class 为我 思路 using close
原文地址:https://www.cnblogs.com/pangbi/p/12578151.html