1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| #include<algorithm> #include<iostream> #include<iomanip> #include<cstring> #include<cstdlib> #include<climits> #include<vector> #include<cstdio> #include<cmath> #include<queue> using namespace std;
inline const int Get_Int() { int num=0,bj=1; char x=getchar(); while(x<'0'||x>'9') { if(x=='-')bj=-1; x=getchar(); } while(x>='0'&&x<='9') { num=num*10+x-'0'; x=getchar(); } return num*bj; }
char s1[3005],s2[3005]; int n,m,M[205],A,B,a[5][5],f[3005][3005][3];
int main() { M['A']=1,M['T']=2,M['G']=3,M['C']=4; scanf("%s %s",s1+1,s2+1); n=strlen(s1+1),m=strlen(s2+1); for(int i=1; i<=4; i++) for(int j=1; j<=4; j++) a[i][j]=Get_Int(); A=Get_Int(),B=Get_Int(); for(int i=0; i<=n; i++) for(int j=0; j<=m; j++) f[i][j][0]=f[i][j][1]=f[i][j][2]=-INT_MAX/2; f[0][0][0]=0; for(int i=1; i<=n; i++) { f[0][i][1]=max(max(f[0][i-1][0],f[0][i-1][2])-A,f[0][i-1][1]-B); f[i][0][2]=max(max(f[i-1][0][0],f[i-1][0][1])-A,f[i-1][0][2]-B); } for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) { f[i][j][0]=max(f[i-1][j-1][0],max(f[i-1][j-1][1],f[i-1][j-1][2]))+a[M[s1[i]]][M[s2[j]]]; f[i][j][1]=max(max(f[i][j-1][0],f[i][j-1][2])-A,f[i][j-1][1]-B); f[i][j][2]=max(max(f[i-1][j][0],f[i-1][j][1])-A,f[i-1][j][2]-B); } printf("%d\n",max(f[n][m][0],max(f[n][m][1],f[n][m][2]))); return 0; }
|