只拿了 40pt ...... 求dalao答疑 qwq
(附:希望有dalao能讲下为什么像题解那样的写法是正确的......,因为题目中有说两个字符串的长度必须相同,感觉直接dp的话考虑不到这一点......)
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
using namespace std;
int n,m;
char s1[1020], s2[1020];
inline int change(char c){
switch(c){
case 'A' : return 1;
case 'T' : return 2;
case 'G' : return 3;
case 'C' : return 4;
//default : return 0;
}
}
int d[5][5], A, B, f[1020][1020][3];
inline int max(int a,int b){return a>b?a:b;}
int read(){
int num=0, f=1;
char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while('0'<=c&&c<='9')num=num*10+(c&15),c=getchar();
return num*f;
}
int main(){
//cin>>s1>>s2;
//int lena = s1.size(), lenb = s2.size();
scanf("%s",s1+1);
scanf("%s",s2+1);
int lena = strlen(s1+1),
lenb = strlen(s2+1);
for(int i=1;i<=4;i++) for(int j=1;j<=4;j++) d[i][j]=read();
memset(f,-0x7f,sizeof(f));
//f[0][0][1] = f[0][0][2] = -0x7fffffff;
//printf("%d\n",f[0][0][1]);
f[0][0][0]=0;
// f[0][1][1]=-A;
// f[1][0][2]=-A;
A=read(), B=read();
for(int i=0;i<=lena;i++){
for(int j=0;j<=lenb;j++){
if(i&&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])) + d[change(s1[i])][change(s2[j])];
if(i)f[i][j][1] = max(f[i-1][j][1] - B, max(f[i-1][j][0] - A, f[i-1][j][2] - A));
if(j)f[i][j][2] = max(f[i][j-1][1] - A, max(f[i][j-1][0] - A, f[i][j-1][2] - B));
}
}
printf("%d",max(f[lena][lenb][0], max(f[lena][lenb][1], f[lena][lenb][2])));
return 0;
}
谢谢dalao!