hdu2476-区间DP

来源:互联网 发布:微信加粉丝软件 编辑:程序博客网 时间:2024/06/10 23:44

题解:我们可以先求把一个空白的字符串搞成跟b一样的串要至少要多少步
然后如果第i个a和b串的字符一样那么ans[i] = min(ans[i],ans[i-1])
也就是是把1到第i变成和b串一样跟1到第i-1变成b串两者去变的最小值
然后ans[i] 要求如果ans[j]+dp[j+1][i]也就是两个分开变和一起变哪种方案最少最后ans[n]就是答案

#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>using namespace std;const int inf = 0x3f3f3f3f;const int mx = 105;int dp[mx][mx];char a[mx];char b[mx];int ans[mx];int dfs(int l,int r){    if(r==l)    return dp[l][r] = 1;    if(l>r) return dp[l][r] = 0;    if(dp[l][r]!=inf)   return dp[l][r];    dp[l][r] = min(dp[l][r],dfs(l+1,r)+1);    for(int i = l+1; i <= r; i++)        if(b[i] == b[l])        dp[l][r] = min(dp[l][r],dfs(l+1,i)+dfs(i+1,r));    return dp[l][r];}int main(){    while(scanf("%s%s",a+1,b+1)!=EOF){        memset(dp,inf,sizeof(dp));        int n = strlen(a+1);        for(int i = 1; i <= n; i++)            for(int j = i; j <= n; j++)                dfs(i,j);        for(int i = 1; i <= n; i++)            ans[i] = dp[1][i];        for(int i = 1; i <= n; i++){            if(a[i] == b[i])                ans[i] = min(ans[i],ans[i-1]);            else{                for(int j = 1; j < i; j++)                    ans[i] = min(ans[i],ans[j]+dp[j+1][i]);            }        }        printf("%d\n",ans[n]);    }    return 0;}
原创粉丝点击