HDU
来源:互联网 发布:软件设计师视频教程 编辑:程序博客网 时间:2024/06/03 19:33
题目描述:
点击打开链接
题意:给你两串字符串,你每次操作可以把串一的某一子串刷成同一字符,问最少需要多少次操作能使串一与串二相同。这种题看着就想用区间DP,考虑如果s2中有首尾相同的子串,那么将这个子串拿出来处理就可以减少一次操作所以对于每个区间就去枚举分割点去找首尾相同的子串,不过我也有一个懵逼的地方,一开始我状态转移的时候是dp[i][j]由dp[i][j-1]初始化各种WA,后来改成dp[i+1][j]初始化就过了,同样都是已经处理过串,怎么结果就不对么。。。QAQ...
AC代码:
#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<stack>#include<queue>#include<set>#include<vector>#include<algorithm>using namespace std;const int MAXM=100;const int INF=0x3f3f3f3f;string s1,s2;int dp[MAXM+10][MAXM+10];int ans[MAXM+10];int main(){ while(cin>>s1>>s2) { int len=s1.size(); memset(dp,0,sizeof(dp)); for (int i=0;i<len;i++) dp[i][i]=1; for (int i=len-1;i>=0;i--) { for (int j=i+1;j<len;j++) { if (s2[j]!=s2[i]) dp[i][j]=dp[i+1][j]+1; else dp[i][j]=dp[i+1][j]; for (int k=i+1;k<j;k++) if (s2[i]==s2[k]) dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]); } } if (s1[0]==s2[0]) ans[0]=0; else ans[0]=1; for (int i=1;i<len;i++) { ans[i]=dp[0][i]; if (s1[i]==s2[i]) ans[i]=min(ans[i-1],ans[i]); for (int j=0;j<i;j++) ans[i]=min(ans[i],ans[j]+dp[j+1][i]); } cout<<ans[len-1]<<endl; } return 0;}
阅读全文
0 0
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- hdu
- hdu
- hdu
- HDU
- 关于java 调用一个solr服务的两个collection
- 数据结构--线性表的链式表示(链表)
- 百练Skew Binary
- Servlet 与 CGI 的比较
- Jsp显示HBase的数据
- HDU
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字
- HDOJ1213. How many tables(并查集连通块计数)
- java指定小数点后位数格式
- php 删除文件夹 以及 文件夹所有文件
- 2017年JD后台岗面经总结-1(不是我的面经)
- 算法总结:连续子串
- 栈(Stack)
- LZ Fix the first bug