这道题初始化容易被人忽略f[0][i],f[i][0]
常规DP,**
#include<bits/stdc++.h> #define INF 0xA1A1A1A1 using namespace std; int n,m; char s1[105],s2[105]; int p[130],f[105][105]; int c[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} };//0 int main() { p['A']=1,p['C']=2,p['G']=3,p['T']=4;//哪个字母对应什么数字p['G']='3'//XXX scanf("%d %s",&n,s1+1);//这里没有加1 scanf("%d %s",&m,s2+1); memset(f,0xf1,sizeof f); f[0][0]=0; for(int i=1;i<=n;i++)//0和i,f[0][i],则i前面的那些数和谁匹配呢?和- f[i][0]=f[i-1][0]+c[p[s1[i]]][5]; for(int i=1;i<=m;i++) f[0][i]=f[0][i-1]+c[5][p[s2[i]]]; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { f[i][j]=max(f[i][j],f[i-1][j-1]+c[p[s1[i]]][p[s2[j]]]); f[i][j]=max(f[i][j],f[i-1][j]+c[p[s1[i]]][5]); f[i][j]=max(f[i][j],f[i][j-1]+c[5][p[s2[j]]]); } printf("%d\n",f[n][m]); return 0; }