最长公共子序列的变形,其实思想上都是一样的,LCS是在字符相同时加1,而这个题是加上题目中给出的bonus. #include<stdio.h> int Nchar; char a[2005],b[2005]; int lena,lenb; char chars[100]; int bonus[100]; int opt[2005][2005]; int nLen1,nLen2; int search(char a) //找出字符对应的bonus { int i; for(i = 1;i <= Nchar;i++) if(chars[i] == a ) return bonus[i]; } int main(void) { int i,j; while(scanf("%d",&Nchar) != EOF) { for( i = 1 ; i <= Nchar ; i++ ) { getchar(); chars[i] = getchar(); scanf("%d",&bonus[i]); } scanf("%s%s",a+1,b+1); lena = strlen(a+1); lenb = strlen(b+1); for( i = 0 ; i <= lena ; i++ ) opt[0][i] = 0; for( i = 0 ; i <= lenb ; i++ ) opt[i][0] = 0; for( i = 1 ; i <= lena ; i++ )//关键代码 { for( j = 1 ; j <= lenb ; j++ ) { if(a[i] == b[j]) opt[i][j] = opt[i-1][j-1] + search(a[i]);//LCS这里是加1 else { nLen1 = opt[i][j-1]; nLen2 = opt[i-1][j]; opt[i][j] = nLen1>nLen2?nLen1:nLen2; } } } printf("%d/n",opt[lena][lenb]); } return 0; }