hdu 2476 区间dp
题意:
给出两个串s1和s2,一次只能将一个区间刷一次,问最少几次能让s1=s2
例如zzzzzfzzzzz,长度为11,我们就将下标看做0~10
先将0~10刷一次,变成aaaaaaaaaaa
1~9刷一次,abbbbbbbbba
2~8:abcccccccba
3~7:abcdddddcba
4~6:abcdeeedcab
5:abcdefedcab
这样就6次,变成了s2串了
其 实如果a串是空串的话,我们可以写出这样的区间dp方程:设dp[i][j]表示从i到j至少要变多少次,则有dp[i][j]=min(dp[i+1] [j]+(b[i]==b[j]?0:1),dp[i+1][k]+dp[k+1][j](b[i]==b[k]))。
然后再考虑a串,设f[i]表示使a[0]~~a[i]==b[0]~~b[i]的最小步数,则有f[i]=min(f[j]+dp[j+1][i],dp[0][i],f[i-1](当a[i]==b[i]时)),即[j+1,i]可以看做一个空串。
if(b[i]==b[k]) dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k+1][j]);
如果b[i]==b[k] 那么刷b[k]的时候一定会顺便刷上b[i] ,则可以少刷一次
2015-07-19:专题训练
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 const int INF=0x3f3f3f3f; 11 const double eps=1e-5; 12 typedef long long ll; 13 #define cl(a) memset(a,0,sizeof(a)) 14 #define ts printf("*****\n"); 15 const int MAXN=1005; 16 int n,m,tt; 17 char a[MAXN],b[MAXN]; 18 int dp[MAXN][MAXN]; 19 int ans[MAXN]; 20 int main() 21 { 22 int i,j,k; 23 #ifndef ONLINE_JUDGE 24 freopen("1.in","r",stdin); 25 #endif 26 while(scanf("%s%s",a,b)!=EOF) 27 { 28 int len=strlen(a); 29 cl(dp); 30 for(i=0;i<len;i++) dp[i][i]=1; 31 for(int d=1;d<len;d++) 32 { 33 for(i=0;i+d<len;i++) 34 { 35 j=i+d; 36 dp[i][j]=dp[i+1][j]+1; 37 for(k=i+1;k<=j;k++) 38 { 39 if(b[k]==b[i]) 40 dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k+1][j]); 41 } 42 } 43 } 44 for(i=0;i<len;i++) 45 { 46 ans[i]=dp[0][i]; 47 } 48 for(i=0;i<len;i++) 49 { 50 if(a[i]==b[i]) 51 { 52 if(i==0) ans[i]=0; 53 else ans[i]=ans[i-1]; 54 } 55 else 56 { 57 for(j=0;j<i;j++) 58 { 59 ans[i]=min(ans[i],ans[j]+dp[j+1][i]); 60 } 61 } 62 } 63 printf("%d\n",ans[len-1]); 64 } 65 }
View Code
2015-05-10:
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 const int INF=0x3f3f3f3f; 11 const double eps=1e-5; 12 typedef long long ll; 13 #define cl(a) memset(a,0,sizeof(a)) 14 #define ts printf("*****\n"); 15 const int MAXN=1005; 16 int n,m,tt; 17 char a[MAXN],b[MAXN]; 18 int dp[MAXN][MAXN]; 19 int ans[MAXN]; 20 int main() 21 { 22 int i,j,k; 23 #ifndef ONLINE_JUDGE 24 freopen("1.in","r",stdin); 25 #endif 26 while(scanf("%s%s",a,b)!=EOF) 27 { 28 int n=strlen(a); 29 cl(dp); 30 for(i=0;i<n;i++) dp[i][i]=1; 31 for(int len=1;len<n;len++) 32 { 33 for(i=0;i+len<=n;i++) 34 { 35 j=i+len; 36 dp[i][j]=dp[i+1][j]+1; 37 for(k=i+1;k<=j;k++) 38 { 39 if(b[i]==b[k]) 40 dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k+1][j]); 41 } 42 } 43 } 44 for(i=0;i<n;i++) 45 { 46 ans[i]=dp[0][i]; 47 } 48 for(i=0;i<n;i++) 49 { 50 if(a[i]==b[i]) 51 { 52 if(i==0) ans[i]=0; 53 else ans[i]=ans[i-1]; 54 } 55 else 56 { 57 for(j=0;j<i;j++) 58 { 59 ans[i]=min(ans[i],ans[j]+dp[j+1][i]); 60 } 61 } 62 } 63 printf("%d\n",ans[n-1]); 64 } 65 }
转载于:https://www.cnblogs.com/cnblogs321114287/p/4269890.html
hdu 2476 区间dp相关推荐
- Palindrome subsequence HDU - 4632 区间dp|记忆化搜索
// 区间dp import java.util.Scanner;/**** @author CN*/ public class main {static int mod = 10007;static ...
- The 2014 ACM-ICPC BeiJing D - Dire Wolf HDU - 5115 区间dp
题意 n个狼 排成一排 我们要把一排狼都删除掉 删除一个狼的花费是这个狼的权值和左右两个狼的附加值 求最小花费 分析 考虑区间dp dp[i][j]表示i到j的最小花费 我们可以枚举其中的k 为序列中 ...
- hdu 4745 区间dp
题意:求一个环的最长回文序列,是序列不是串 链接:点我 起点是可以任意的, 所以只要求出每个区间的最长回文序列之后取max(dp[1][i]+dp[i+1][n]),即可得最终答案 本来是想扩展两倍的 ...
- You Are the One HDU - 4283 区间DP
https://cn.vjudge.net/problem/HDU-4283 题目大意n个人轮流上台,第i个人有一个屌丝值Di 当他为第k个上台的人时候会获得屌丝值(K-1)*Di, 这些人轮流上台, ...
- hdu 5115 区间dp 狼BUFF
题目大意:你是一个战士现在面对,一群狼,每只狼都有一定的主动攻击力和附带攻击力.你杀死一只狼.你会受到这只狼的(主动攻击力+旁边两只狼的附带攻击力)这么多伤害~现在问你如何选择杀狼的顺序使的杀完所有狼 ...
- HDU 2476 String painter (区间DP)
题意:给出两个串a和b,一次只能将一个区间刷一次,问最少几次能让a=b 思路:首先考虑最坏的情况,就是先将一个空白字符串刷成b需要的次数,直接区间DP[i][j]表示i到j的最小次数. 再考虑把a变成 ...
- HDU 5115 Dire Wolf 区间dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5115 Dire Wolf Time Limit: 5000/5000 MS (Java/Others ...
- HDU 5693 D Game 区间dp
D Game 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5693 Description 众所周知,度度熊喜欢的字符只有两个:B 和D. 今天,它 ...
- hdu 4597 + uva 10891(一类区间dp)
题目链接:http://vjudge.net/problem/viewProblem.action?id=19461 思路:一类经典的博弈类区间dp,我们令dp[l][r]表示玩家A从区间[l, r] ...
最新文章
- 适配器模式(三种)简单使用
- java 取得textfield_怎样获取java中textfield的内容
- dex文件结构(二):dex文件加载基本原理
- 100题_22 整数的二进制表示中1的个数
- 给Event handler传递动态参数
- canvas学习绘制扇形
- boost::geometry::geometry_id用法的测试程序
- windows Navicat Premium连接oracle
- 实现仿简书选取内容生成分享图片效果
- 微机笔记2——8086/8088指令系统
- Android判断App是否在前台运行
- matlab中做出球面和圆柱面,MATLAB中的柱面与球面
- OpenNESS,开源的边缘网络服务平台
- 水果店营业额下降原因,水果店如何提高营业额
- 百宝云Web网络验证系统防破解设置
- linux 合并多个pdf,Linux 下合并 PDF
- 操作系统—CPU调度与内存管理
- linux 部署 程序,Linux 部署配置WEB APP
- android usb 流程
- Appium TestNg Maven Android Eclipse java简单启动实例
热门文章
- Pygal简单使用——模拟掷骰子
- windows下使用word2vec训练维基百科中文语料全攻略!(三
- 最全面超大规模数据集下载链接汇总(转)
- Spyder清除Variable Explorer手动安装protobuf3.0(为了配置windows的python接口)
- 复练-软考高级-论文写作专题
- 7系统启动到一半停止_扛不住了!可口可乐巨震:500个品牌砍一半,裁员4000人.........
- python文件的路径_如何从目录中给出python文件的路径
- 拼接图像亮度均匀调整_品质不变 价格更香 | 爆款拼接屏新品上市
- c语言string函数的用法_同一个函数的五六个版本,C++string insert函数详解
- arm架构和x86架构_ARM、X86和MIPS主流架构优缺点分析