hdu2467
分析
费了好大劲才看懂题目,有个刷子刷一段区间,将a串刷成b串。
思路就是先单独对b串以空串为目标进行区间dp,这里初始化 是dp[i][j]=dp[i+1][j]+1;而之后更新的位置则是s2[k]==s2[i]也就是刷子的两端。然后根据dp以及a串进行结果的更新,可以看代码理解。
可以参考这微博主的。http://blog.csdn.net/a601025382s/article/details/12379565
题目
http://acm.hdu.edu.cn/showproblem.php?pid=2476
代码
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
char s1[105],s2[105];
int dp[105][105];
int ans[105];
int main()
{
while(scanf("%s%s",s1,s2)!=EOF)
{
int n=strlen(s1);
memset(dp,0,sizeof(dp));
for(int i=0; i<n; i++) dp[i][i]=1;
for(int len=2; len<=n; len++)
{
for(int i=0; i+len-1<n; i++)
{
int j=i+len-1;
dp[i][j]=dp[i+1][j]+1;
for(int k=i+1; k<=j; k++)
{
if(s2[k]==s2[i])
dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k+1][j]);
}
}
}
for(int i=0; i<n; i++) ans[i]=dp[0][i];
for(int i=0; i<n; i++)
{
if(s1[i]==s2[i])
{
if(i==0) ans[i]=0;
else ans[i]=ans[i-1];
}
else
{
for(int j=0; j<i; j++)
ans[i]=min(ans[i],ans[j]+dp[j+1][i]);
}
}
printf("%d\n",ans[n-1]);
}
return 0;
}