跟最长公共字串差不多, #include<iostream> #include<string.h> #include<string> #define MAX 2008 using namespace std; int n; int score[256]; int mark[MAX][MAX]; int main() { int i,c,j,lx,ly,maxc; char ch; string str1,str2; while(cin>>n) { for(i=0;i<n;i++) { cin>>ch>>c; score[ch]=c; } cin>>str1>>str2; lx=str1.length(); ly=str2.length(); memset(mark,0,sizeof(mark)); for(i=1;i<=lx;i++) { for(j=1;j<=ly;j++) { if(str1[i-1]==str2[j-1]) { mark[i][j]=mark[i-1][j-1]+score[str1[i-1]]; } else { if(mark[i][j-1]>mark[i-1][j]) mark[i][j]=mark[i][j-1]; else mark[i][j]=mark[i-1][j]; } } } cout<<mark[lx][ly]<<endl; } return 0; }