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;}
阅读全文
0 0
- hdu2476区间dp
- hdu2476区间dp
- hdu2476(区间DP)
- hdu2476 区间DP
- hdu2476(区间dp)
- hdu2476(区间dp)
- hdu2476(区间dp)
- HDU2476 区间DP
- hdu2476(区间DP)
- hdu2476-区间DP
- hdu2476(区间dp)
- HDU2476(区间dp)
- hdu2476(区间dp+普通dp)
- HDU2476:String painter(区间DP)
- HDU2476 String painter 区间DP
- HDU2476-String painter-区间DP
- hdu2476【区间DP,未完待续】
- HDU2476(区间DP)详解
- 战场的数目——湖南省第六届大学生计算机程序设计竞赛
- 手动HashMap的简单实现
- 8皇后
- 【OpenStack源码分析之六】从虚拟机启动流程看安全认证
- 带进度条上传多视频
- hdu2476-区间DP
- 工厂方法模式简单介绍(Java语言)
- 使用PHP二维码生成类库PHP QR Code生成二维码
- leetcode 26. Remove Duplicates from Sorted Array
- <body>标签常用属性
- Android学习之按键操作
- python书籍推荐
- Spring—Quartz定时调度CronTrigger时间配置格式说明与实例
- Opencv轮廓跟踪算法源码分析(1)——icvFetchContour()