题目地址:点击打开链接
思路:最长公共子序列的变形
AC代码:
#include<stdio.h> #include<string.h> #define MAX 2500//别加分号 int dp[MAX][MAX]; char a[MAX],b[MAX],c[MAX]; int max(int a,int b) { return a > b ? a : b; }; int main() { int n,d[MAX],l,k; int i,j; while(scanf("%d",&n) != EOF) { scanf("%s",a); for(i=0; i<n; i++) { scanf("%d",&d[a[i] - 'a']);//存储每种子弹的分值 } scanf("%s",b); scanf("%s",c); l = strlen(b); k = strlen(c); //memset(dp,0,sizeof(dp));每个都初始化,超时 for(i=0; i<=l; i++) dp[i][0] = 0; for(i=0; i<=k; i++) dp[0][i] = 0; for(i=1; i<=l; i++) { for(j=1; j<=k; j++) { if(b[i-1] == c[j-1]) { dp[i][j] = dp[i-1][j-1] + d[b[i-1] - 'a']; } else { dp[i][j] = max(dp[i-1][j] ,dp[i][j-1]); } } } printf("%d\n",dp[l][k]); } return 0; }