和最大公共子序列相似!
#include<stdio.h> #include<string.h> #include<stdlib.h> int dp[1002][1002]; int min3(int a,int b,int c) { if(a<=b&&a<=c) return a; if(b<=a&&b<=c) return b; if(c<=a&&c<=b) return c; return 0; } int main() { int m,n,k,t; int i,j; char a[1002],b[1002]; scanf("%d",&t); while(t--) { memset(dp,0,sizeof(dp)); scanf("%d%d%d",&n,&m,&k); for(i=0;i<1002;i++) dp[0][i]=dp[i][0]=i*k; getchar();a[0]=b[0]=' '; for(i=1;i<=n;i++) scanf("%c",&a[i]);a[i]='\0'; getchar(); for(i=1;i<=m;i++) scanf("%c",&b[i]);b[i]='\0'; for(i=1;i<=n;i++) for(j=1;j<=m;j++) if(a[i]==b[j])dp[i][j]=dp[i-1][j-1]; else dp[i][j]=min3(dp[i-1][j-1] + abs(a[i] - b[j]), dp[i][j-1] + k, dp[i-1][j] + k); printf("%d\n",dp[n][m]); } return 0; } //dp[i][j] = min3(dp[i-1][j-1] + abs(a[i] - b[j]), dp[i][j-1] + k, dp[i-1][j] + k);