hdu2476(区间dp+普通dp)
2016-05-31 16:51
323 查看
链接:点击打开链接
题意:给出两个串s1和s2,一次只能将一个区间(区间必须连续并且不限长度)全部变换成一个字母,问最少几次能将s1变换成s2
代码:
题意:给出两个串s1和s2,一次只能将一个区间(区间必须连续并且不限长度)全部变换成一个字母,问最少几次能将s1变换成s2
代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; const int INF=0x3f3f3f3f; int ans[105],dp[105][105]; char s1[105],s2[105]; int main(){ int i,j,k,l,len; while(scanf("%s%s",s1+1,s2+1)!=EOF){ memset(dp,INF,sizeof(dp)); len=strlen(s1+1); memset(dp,0,sizeof(dp)); for(i=1;i<=len;i++) dp[i][i]=1; //dp[i][j]表示由空串变到s2需要多少次 for(l=2;l<=len;l++){ for(i=1;i<=len-l+1;i++){ j=i+l-1; dp[i][j]=dp[i+1][j]+1; //单独变换第一个 for(k=i+1;k<=j;k++) if(s2[i]==s2[k]) //和边界相等时可能会减少变换次数 dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k+1][j]); } } for(i=1;i<=len;i++) ans[i]=dp[1][i]; for(i=1;i<=len;i++){ //相当于再用一次dp if(s1[i]==s2[i]) ans[i]=ans[i-1]; else for(j=1;j<i;j++) ans[i]=min(ans[i],ans[j]+dp[j+1][i]); } printf("%d\n",ans[len]); } return 0; }
相关文章推荐
- 服务器监控之zabbix监控Tomcat篇
- 大话数据结构:线性表(3)
- 创建表空间
- requestWindowFeature使用详解
- hiho_1078_线段树区间修改
- 高效使用STL
- 操作系统设计与实现 第二章 进程(五)
- [Ruby On Rails] Action Controller - 控制HTTP 流程
- Android跨进程通信一 Messenger
- java 内部类
- spring(3)高级装配
- HTML5定稿了,为什么原生App世界将被颠覆
- 学习练习 java 输入输出流练习2
- ubuntu下nfs服务器的安装与配置
- eclipse java.lang.OutOfMemoryError: Java heap space
- NumberPicker中ArrayIndexOutOfBoundsException解决方案
- Java读写文件方法总结(推荐)
- 判断密码
- 关于shaderLab中 tags(标签)
- Unity调用IOS时间日期控件UIDatePicker