【UVA1371】Period (二分+DP)
题意:
给出两个字符串A,B将B分解成若干个子字符串,然后每个子字符串都要经过编辑变成字符串A,所有子串中编辑最多的次数即为当前状态下的最大编辑次数,要求求最小的最大编辑次数。
编辑操作包括修改、删除和插入。(|A|<=5000,|B|<=50)
分析:
因为A的长度较大,直接算出A每个区间对应B的编辑次数的方法是不可取的。因为是求最大值最小化,可以想到二分答案然后判断。
判断的时候用DP,dp[i][j]表示到1~i的字符串匹配到j的最大编辑次数。当dp[i][m]<=mid时(mid为二分出来的当前答案),就可以将dp[i][0] 置0,表示做为起点(因为此时可以在i后面分段)。
打代码的时候出现了一个问题,当我dp[i][m]<=mid时,我把dp[i][0] 置0的同时,还把dp[i]的其他值全部置成INF,这样做是有问题的。比如,x=abcdabcabb,y=abc,当mid=1时,前面两个字符ab的编辑长度刚好为一,此时我直接把ab分成一段了,这样导致我把第三个字符c扔在一边。其实把abc一起放成一段更好。问题就出在我把dp[i][0] 置0的同时还把dp[i]的其他值全部置成INF。这样做相当于默认我把i前面的分成一段,但事实上或许再加一个字符编辑距离仍然不超过mid,这样可能会使后面的答案更优而我却没有找到最优解,于是就产生判断错误。所以只需把dp[i][0] 置0即可,这样子就表示我们可以把i前面的字符分成一段,当然也可以再加一些字符再分成一段。
代码如下:
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
#define Maxn 5010
#define Maxm 60 char a[Maxn],b[Maxm];
int n,m; int f[Maxn][Maxm]; int mymin(int x,int y) {return x<y?x:y;} bool dp(int x)
{
memset(f,,sizeof(f));
for(int i=;i<=m;i++) f[][i]=i;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
if(a[i]==b[j]) f[i][j]=mymin(f[i][j],f[i-][j-]);
else f[i][j]=mymin(f[i][j],f[i-][j-]+);
f[i][j]=mymin(f[i][j],f[i-][j]+);
f[i][j]=mymin(f[i][j],f[i][j-]+);
}
if(f[i][m]<=x)
{
if(i==n) return ;
f[i][]=;
}
if(i==n) return ;
}
} void ffind()
{
scanf("%s%s",b+,a+);
n=strlen(a+);m=strlen(b+);
int l=,r=n;
while(l<r)
{
int mid=(l+r)>>;
if(dp(mid)) r=mid;
else l=mid+;
}
printf("%d\n",l);
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
ffind();
}
return ;
}
uva1371
2016-03-06 16:47:51
貌似已经看到很多题二分加DP了~
【UVA1371】Period (二分+DP)的更多相关文章
- UVA - 1371 Period 二分+dp
思路:设字符串x的长度为n,y的长度为m,那么答案一定在[0, m]之间,那么可以二分求答案. d(i, j)表示第一个串前i个字符至少需要经过多少次才能的到第二个串的前j个字符,转移方程d(i, j ...
- 二分+DP HDU 3433 A Task Process
HDU 3433 A Task Process Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- hdu 3433 A Task Process 二分+dp
A Task Process Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- 2018.10.24 NOIP模拟 小 C 的数组(二分+dp)
传送门 考试自己yyyyyy的乱搞的没过大样例二分+dp二分+dp二分+dp过了606060把我自己都吓到了! 这么说来乱搞跟被卡常的正解比只少101010分? 那我考场不打其他暴力想正解血亏啊. 正 ...
- 「学习笔记」wqs二分/dp凸优化
[学习笔记]wqs二分/DP凸优化 从一个经典问题谈起: 有一个长度为 \(n\) 的序列 \(a\),要求找出恰好 \(k\) 个不相交的连续子序列,使得这 \(k\) 个序列的和最大 \(1 \l ...
- 【bzoj1044】[HAOI2008]木棍分割 二分+dp
题目描述 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长度最小, 并且 ...
- Luogu P2511 [HAOI2008]木棍分割 二分+DP
思路:二分+DP 提交:3次 错因:二分写萎了,$cnt$记录段数但没有初始化成$1$,$m$切的次数没有$+1$ 思路: 先二分答案,不提: 然后有个很$naive$的$DP$: 设$f[i][j] ...
- 洛谷$P4322\ [JSOI2016]$最佳团体 二分+$dp$
正解:二分+$dp$ 解题报告: 传送门$QwQ$ 这题长得好套路嗷,,,就一看就看出来是个$01$分数规划+树形$dp$嘛$QwQ$. 考虑现在二分的值为$mid$,若$mid\leq as$,则有 ...
- $bzoj3872\ [Poi2014]\ Ant\ colony$ 二分+$dp$
正解:二分+$dp$ 解题报告: 传送门$QwQ$ 一年过去了依然没有头绪,,,$gql$的$NOIp$必将惨败了$kk$. 考虑倒推,因为知道知道除数和答案,所以可以推出被除数的范围,然后一路推到叶 ...
随机推荐
- Android(java)学习笔记173:BroadcastReceiver之 静态注册 和 动态注册
1. 广播接受者>什么是广播.收音机.电台:对外发送信号.收音机:接收电台的信号. >在android系统里面,系统有很多重要的事件: 电池电量低,插入充电器,sd卡被移除,有电话打出去, ...
- 简洁JS 日历控件 支持日期和月份选择
原文出处 以下这个JS日历控件是我的闲暇之余自己编写的,所有的代码全部在IE7/IE8/Firefox下面测试通过, 而且可以解决被iframe层遮盖的问题.现在只提供两种风格(简洁版和古典版)和两种 ...
- wps批量使标题靠文档左边
- 解决Visual Studio 找不到报表控件、rdlc中文乱码
找回报表控件 运行安装程序中的 ..\packages\Reporting Services\RVAddon.msi 工具栏,右键选择ReportViewer,注意选择的版本 如果不能编辑报表文件(. ...
- 学习java随笔第九篇:java异常处理
在java中的异常处理和c#中的异常处理是一样的都是用try-catch语句. 基本语法如下 try { //此处是可能出现异常的代码 } catch(Exception e) { //此处是如果发生 ...
- C#调用cmd程序,读取结果
示例,调用cmd执行PING命令,读取结果,代码如下: using System; using System.Collections.Generic; using System.Linq; using ...
- oracle数据库的导出与导入
导出:exp devtest10/dev10@172.16.7.39:1521/WSRZ file=d:\WSRZ.dmp log=d:\WSRZ.log full=y 导入:imp testdb/t ...
- Javascript面试题浅析
分享几道JavaScript相关的面试题. 字符串反转 这这里提供了两种解题思路.如果各位读者还有其他的思路,可以分享交流! 第一方法: function reverse(str){ var sp = ...
- .NET生成静态页面例子
主要做法如下: 1.创建网站,并创建一个模板页,template.htm 2.添加一个web窗体Default.aspx 3.在网站下新建文件夹htm,设置该文件夹的属性,确保该文件夹具有可写权限 详 ...
- 校省选赛第一场A题Cinema题解
今天是学校省选的第一场比赛,0战绩收工,死死啃着A题来做,偏偏一直WA在TES1. 赛后,才发现,原来要freopen("input.txt","r",stdi ...