[SDOI2006]最短距离
声明:
本篇文章只大概讲思路
原串设为$s1$,目标串设为$s2$,$n1,n2$分别为他们的长度
我们考虑$dp$,设$f[i][j]$表示$s1$中删除到了第$i$个字符,$s2$中添加到了第$j$个字符,那么对于每种操作,我们如下转移:
$1、Delete$:(删除操作,不需要判断,直接转移,此时的费用为$s1$删除到$i-1$,$s2$添加到$j$时的费用加上删除的费用并且取最小值)
$f[i][j]=min(f[i][j],f[i-1][j]+pay[1]$
$2、Repalce$:(替换操作,不需要判断,直接转移,此时的费用为$s1$删除到$i-1$,$s2$添加到$j-1$时的费用加上费用取最小值)
$f[i][j]=min(f[i][j],f[i-1][j-1]+pay[2])$
$3、Copy$:(复制操作,需要判断,当现在的$i,j$相同时转移)
$if(s1[i]==s2[j])
f[i][j]=min(f[i][j],f[i-1][j-1]+pay[3]);$
$4、Insert$:(插入操作,不需要判断,直接转移)
$f[i][j]=min(f[i][j],f[i][j-1]+pay[4])$
$5、Twiddle$:(需要判断,当$i>=2\&\&j>=2\&\&s1[i-1]==s2[j]\&\&s1[i]==s2[j-1]$的时候转移)
$if(i>=2\&\&j>=2\&\&s1[i-1]==s2[j]\&\&s1[i]==s2[j-1])$
$f[i][j]=min(f[i][j],f[i-2][j-2]+pay[5])$
$6、Kill$:(单独拿出来用,最后判断一下)
$for(int i=1;i<n1;++i)$
$f[n1][n2]=min(f[n1][n2],f[i][n2]+(n1-i)*pay[1]-1)$
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#define N 210
#define inf 0x3f3f3f3f
using namespace std;
char s1[N],s2[N];
int n1,n2;
int pay[6],f[N][N];//f[i][j]中i表示s1中已经删除到i个字符,j表示s2串中已经添加到j个字符
int main()
{
scanf(" %s %s",s1+1,s2+1);
n1=strlen(s1+1),n2=strlen(s2+1);
for(int i=1;i<=5;++i)
scanf("%d",&pay[i]);
for(int i=1;i<=n1;++i)
for(int j=1;j<=n2;++j)
f[i][j]=inf;
for(int i=1;i<=n1;++i)
f[i][0]=pay[1]*i;
for(int i=1;i<=n2;++i)
f[0][i]=pay[4]*i;
f[0][0]=0;
for(int i=1;i<=n1;++i)
{
for(int j=1;j<=n2;++j)
{
if(s1[i]==s2[j])
f[i][j]=min(f[i][j],f[i-1][j-1]+pay[3]);
f[i][j]=min(f[i][j],f[i-1][j]+pay[1]);
f[i][j]=min(f[i][j],f[i][j-1]+pay[4]);
f[i][j]=min(f[i][j],f[i-1][j-1]+pay[2]);
if(i>=2&&j>=2&&s1[i-1]==s2[j]&&s1[i]==s2[j-1])
f[i][j]=min(f[i][j],f[i-2][j-2]+pay[5]);
}
}
for(int i=1;i<n1;++i)
f[n1][n2]=min(f[n1][n2],f[i][n2]+(n1-i)*pay[1]-1);
printf("%d",f[n1][n2]);
}
[SDOI2006]最短距离的更多相关文章
- P2453 [SDOI2006]最短距离
题目描述 一种EDIT字母编辑器,它的功能是可以通过不同的变换操作可以把一个源串X [l..m]变换为新的目标串y[1..n].EDIT提供的变换操作有: 源串中的单个字符可被删除(delete): ...
- P2453 [SDOI2006]最短距离 dp
自己想出来了!这个dp比较简单,而且转移也很简单,很自然,直接上代码就行了. 题干: 一种EDIT字母编辑器,它的功能是可以通过不同的变换操作可以把一个源串X [l..m]变换为新的目标串y[1..n ...
- 点(x3,y3)到经过点(x1,y1)和点(x2,y2)的直线的最短距离
/// <summary> /// 点(x3,y3)到经过点(x1,y1)和点(x2,y2)的直线的最短距离 /// </summary> /// <param name ...
- [ACM_几何] The Deadly Olympic Returns!!! (空间相对运动之最短距离)
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28235#problem/B 题目大意: 有两个同时再空间中匀速运动的导弹,告诉一个时间以 ...
- 求DAG上两点的最短距离
Problem 给出一个不带边权(即边权为1)的有向无环图(unweighted DAG)以及DAG上两点s, t,求s到t的最短距离,如果无法从s走到t,则输出-1. Solution DFS,BF ...
- HDU 2083 简易版之最短距离 --- 水题
HDU 2083 简易版之最短距离 /* HDU 2083 简易版之最短距离 */ #include <cstdio> #include <algorithm> using n ...
- codeforces 590C C. Three States(bfs+连通块之间的最短距离)
题目链接: C. Three States time limit per test 5 seconds memory limit per test 512 megabytes input standa ...
- hdoj 2083 简易版之最短距离
简易版之最短距离 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- [LeetCode]Word Ladder 最短距离字符串转换 (Dijkstra)
要求最短距离.采纳dijkstra查找节点之间的最短路径. 当心:假设是一个枚举字典22是否元素可以,如果转换,暂停. 提高:每串,带您历数它的字符值事件,对于的长度n一个字符串枚举n*26次要. 设 ...
随机推荐
- (四)mybatis 的主键返回
目录 文章目录 自增主键(LAST_INSERT_ID()) 非自增主键(UUID() ) 自增主键(LAST_INSERT_ID()) 在映射关系文件中配置 <!--插入用户--> &l ...
- linux 从远程服务器拷贝文件
1.从服务器复制文件到本地: scp root@192.168.1.100:/data/test.txt /home/myfile/ 2.从服务器复制文件夹到本地: scp -r root@192.1 ...
- CF1032B Personalized Cup
一个多月前写的题,既然没人写题解,那蒟蒻就写一篇吧 基本思路 既然是输出任意一个解,那么号的位置在那里是没有关系的.我的思路是默认*号在最后面,然后对输入的字符串输出的行数进行分类. 代码 #incl ...
- 有趣的后渗透工具 Koadic
koadic是DEFCON黑客大会上分享出来的的一个后渗透工具,虽然和msf有些相似,但是Koadic主要是通过使用Windows ScriptHost(也称为JScript / VBScript)进 ...
- C#进阶之WebAPI(三)
今天复习一下WebAPI的路由知识: 首先分析一下MVC路由和WebAPI路由的区别: 在mvc里,默认的路由机制是通过URL路径去匹配控制器和Action方法的,在mvc中的默认路由定义在App_S ...
- MVC授权不通过之后不执行任何自定义ActionFilter
如下一个Action [Authorize] [F1]//自定义过滤器,继承自ActionFilter public ActionResult Index() { return View(); } 如 ...
- luogu题解 P3629 【[APIO2010]巡逻】树的直径变式
题目链接: https://www.luogu.org/problemnew/show/P3629 分析 最近被众多dalao暴虐,这道题傻逼地调了两天才知道错哪 不过这题比较良心给你一个容易发现性质 ...
- 【php设计模式】观察者模式
当对象间存在一对多关系时,则使用观察者模式.比如,当一个对象被修改时,则会自动通知它的依赖对象.观察者模式属于行为型模式. <?php class Subject{ private $obser ...
- 深入JavaScript对象(Object)与类(class),详细了解类、原型
JavaScript基于原型的对象机制 JavaScript原型上的哪些事 一.JavaScript基于原型的对象机制 JavaScript对象是基于原型的面向对象机制.在一定程度上js基于原型的对象 ...
- linux 目录结构及VIM
目录结构及VIM 文件系统 说明: 文件系统就是操作管理存储设备或分区上的文件的方法和数据结构,也就是存储设备上组织文件的方式. 操作系统中负责管理和存储文件信息的软件机构叫文件管理系统,简称为文件系 ...