题意是让你把第一个字符串变为第二个的最小步数,具体变法就不说了,
假设第一个和第二个串对应位置全都不一样,那就先不考虑串1了,dp【i】【j】i到j的最小步数;很显然开始dp【i】【j】=dp【i+1】【j】 我是从后往前跑的,如果中间处在相等比如str【i】=str【k】 则dp【i】【k】=dp【i+1】【k】 因为如果刷i到k-1要x步刷i+1到k要y步,现在str【i】==str【k】 如果第k个不和第i个一起刷 及先刷i再刷i+1到k-1 再刷k 则需要x+1步
其实如果i和k一起刷 则只需要x步 所有这里枚举i到j之间所有的这种可能 找到最小值即可, 最后考虑串1余循环2 有相等的情况 还是和前面一样的想法
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; #define INF 0x3f3f3f3f char str1[110],str2[110]; int dp[110][110]; int min(int a,int b) { return a<b?a:b; } int main() { int i,j; while(~scanf("%s%s",str1,str2)) { int len=strlen(str1); memset(dp,0,sizeof(dp)); for(i=len-1;i>=0;i--) { dp[i][i]=1; for(j=i+1;j<len;j++) { dp[i][j]=dp[i+1][j]+1; for(int x=i+1;x<=j;x++) { if(str2[i]==str2[x]) dp[i][j]=min(dp[i][j],dp[i+1][x]+dp[x+1][j]); } } } int dp1[110]; for(i=0;i<len;i++) { dp1[i]=dp[0][i]; if(str1[i]==str2[i]) { if(i==0) dp1[i]=0; else { dp1[i]=dp1[i-1]; } } else { for(j=0;j<i;j++) dp1[i]=min(dp1[i],dp1[j]+dp[j+1][i]); } } printf("%d\n",dp1[len-1]); } return 0; }
时间: 2024-10-23 05:47:13