1. 程式人生 > >洛谷 P1140 相似基因 動態規劃

洛谷 P1140 相似基因 動態規劃

dp[i][j]表示a的前i個鹼基與b的前j個鹼基的最大相似度

(ai,bi)表示鹼基ai與bi之間的相似度

狀態方程:dp[i][j]=max(dp[i-1][j-1]+(ai,bi),dp[i][j-1]+(-,bj),dp[i-1][j]+(ai,-))

#include<iostream>
#include<cstdio>
using namespace std;
int ff[6][6]={{0,0,0,0,0,0},{0,5,-1,-2,-1,-3},{0,-1,5,-3,-2,-4},{0,-2,-3,5,-2,-2},
{0,-1,-2,-2,5,-1},{0,-3
,-4,-2,-1,0}};//鹼基對應表 int dp[105][105]; char a[105],b[105]; int aa,bb; int chang(char x)//將字元轉化為ff陣列對應的下標 { if(x=='A')return 1;if(x=='C')return 2; if(x=='G')return 3;if(x=='T')return 4; return 0; } int maxx(int a,int b,int c) { int x; x=max(a,b); x=max(x,c); return x; } void solve() {
int i,j; cin>>aa; getchar(); for(i=1;i<=aa;i++)cin>>a[i]; cin>>bb; getchar(); for(i=1;i<=bb;i++)cin>>b[i]; // dp[1][0]=ff[chang(a[1])][5]; // dp[0][1]=ff[5][chang(b[1])]; for(i=1;i<=aa;i++)dp[i][0]=dp[i-1][0]+ff[chang(a[i])][5];//初始化 for(i=1
;i<=bb;i++)dp[0][i]=dp[0][i-1]+ff[5][chang(b[i])];//初始化 for(i=1;i<=aa;i++) for(j=1;j<=bb;j++) dp[i][j]=maxx(dp[i-1][j-1]+ff[chang(a[i])][chang(b[j])],dp[i-1][j]+ff[chang(a[i])][5],dp[i][j-1]+ff[5][chang(b[j])]); cout<<dp[aa][bb]<<endl; } int main() { solve(); }