hdu2467 String painter(区间dp)

来源:互联网 发布:录干音用什么软件 编辑:程序博客网 时间:2024/05/22 00:35

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;}
0 0
原创粉丝点击