HDU2476
题解
- 首先将空串刷成目标串的最小方案数。
- 对于abbaa,我们两次就可以搞定。aaaaa-->abbaa,一次性连续刷一段,再刷中间。从头开始一段段刷是最差的方法。
- 再从给定串刷到目标串的最优方案。
代码
#include <bits/stdc++.h>
using namespace std;
int const N = 100 + 10;
char s1[N],s2[N];
int dp[N][N],ans[N];
int main(){
while(~scanf(" %s%s",&s1,&s2)){
memset(dp,0,sizeof(dp));
int len = strlen(s1);
for(int i=len-1;i>=0;i--){ //从空串刷成目标串的次数
for(int j=i;j<len;j++){
dp[i][j] = dp[i+1][j] + 1; //直接单独刷,不考虑连续的字母
for(int k=i+1;k<=j;k++)
if(s2[i] == s2[k]) //从i连续刷到k
dp[i][j] = min(dp[i][j],dp[i+1][k] + dp[k+1][j]);
}
}
for(int i=0;i<len;i++){
if(s1[i] == s2[i])
ans[i] = ans[i-1];
else{
ans[i] = dp[0][i]; //最差的方案。
for(int j=0;j<i;j++)
ans[i] = min(ans[i],ans[j] + dp[j+1][i]);
}
}
printf("%d\n",ans[len-1]);
}
return 0;
}