题目:https://www.luogu.org/problemnew/show/P4059
dp。
1.看出-A-B(k-1)可以理解成连续空格的第一个 -A,其余 -B;
2.把会干扰的“上一步右端是不是空格”加进参数里;
3.初始化!!!!!!!
#include<iostream> #include<cstdio> #include<cstring> using namespace std; char ch; int a[3005],b[3005],n,m,c[5][5],d[3005][3005][2][2],A,B; int num(char chh)//A=65 T=84 G=71 C=67 { if(chh=='A')return 1; if(chh=='T')return 2; if(chh=='G')return 3; if(chh=='C')return 4; } int main() { while(1) { scanf("%c",&ch); if(ch==' ')continue; if(ch==' ')break; a[++n]=num(ch); } while(1) { scanf("%c",&ch); if(ch==' ')continue; if(ch==' ')break; b[++m]=num(ch); } for(int i=1;i<=4;i++) for(int j=1;j<=4;j++) scanf("%d",&c[i][j]); scanf("%d%d",&A,&B); memset(d,-3,sizeof d); d[0][1][0][1]=-A; for(int i=2;i<=m;i++) d[0][i][0][1]=d[0][i-1][0][1]-B; d[1][0][1][0]=-A; for(int i=2;i<=n;i++) d[i][0][1][0]=d[i-1][0][1][0]-B; d[0][0][1][1]=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { d[i][j][1][1]=max(d[i-1][j-1][1][1],max(d[i-1][j-1][1][0],d[i-1][j-1][0][1]))+c[a[i]][b[j]]; d[i][j][0][1]=max(d[i][j-1][0][1]-B,max(d[i][j-1][1][0]-A,d[i][j-1][1][1]-A)); d[i][j][1][0]=max(d[i-1][j][1][0]-B,max(d[i-1][j][0][1]-A,d[i-1][j][1][1]-A)); } int ans=max(d[n][m][1][1],max(d[n][m][1][0],d[n][m][0][1])); printf("%d",ans); return 0; }