洛谷题目链接

声明:

本篇文章只大概讲思路


原串设为$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]最短距离的更多相关文章

  1. P2453 [SDOI2006]最短距离

    题目描述 一种EDIT字母编辑器,它的功能是可以通过不同的变换操作可以把一个源串X [l..m]变换为新的目标串y[1..n].EDIT提供的变换操作有: 源串中的单个字符可被删除(delete): ...

  2. P2453 [SDOI2006]最短距离 dp

    自己想出来了!这个dp比较简单,而且转移也很简单,很自然,直接上代码就行了. 题干: 一种EDIT字母编辑器,它的功能是可以通过不同的变换操作可以把一个源串X [l..m]变换为新的目标串y[1..n ...

  3. 点(x3,y3)到经过点(x1,y1)和点(x2,y2)的直线的最短距离

    /// <summary> /// 点(x3,y3)到经过点(x1,y1)和点(x2,y2)的直线的最短距离 /// </summary> /// <param name ...

  4. [ACM_几何] The Deadly Olympic Returns!!! (空间相对运动之最短距离)

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28235#problem/B 题目大意: 有两个同时再空间中匀速运动的导弹,告诉一个时间以 ...

  5. 求DAG上两点的最短距离

    Problem 给出一个不带边权(即边权为1)的有向无环图(unweighted DAG)以及DAG上两点s, t,求s到t的最短距离,如果无法从s走到t,则输出-1. Solution DFS,BF ...

  6. HDU 2083 简易版之最短距离 --- 水题

    HDU 2083 简易版之最短距离 /* HDU 2083 简易版之最短距离 */ #include <cstdio> #include <algorithm> using n ...

  7. codeforces 590C C. Three States(bfs+连通块之间的最短距离)

    题目链接: C. Three States time limit per test 5 seconds memory limit per test 512 megabytes input standa ...

  8. hdoj 2083 简易版之最短距离

    简易版之最短距离 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  9. [LeetCode]Word Ladder 最短距离字符串转换 (Dijkstra)

    要求最短距离.采纳dijkstra查找节点之间的最短路径. 当心:假设是一个枚举字典22是否元素可以,如果转换,暂停. 提高:每串,带您历数它的字符值事件,对于的长度n一个字符串枚举n*26次要. 设 ...

随机推荐

  1. Linux系统忘记root密码,紧急模式下更改密码

    linux忘记密码命令概括: 1.开机按e,rd.break,ctrl+x: 2.mount  -o remount,rw /sysroot  3.chroot  /sysroot 4.passwd( ...

  2. DP_Sumsets

    Farmer John commanded his cows to search for different sets of numbers that sum to a given number. T ...

  3. linux fork进程请谨慎多个进程/线程共享一个 socket连接,会出现多个进程响应串联的情况。

    昨天组内同学在使用php父子进程模式的时候遇到了一个比较诡异的问题 简单说来就是:因为fork,父子进程共享了一个redis连接.然后父子进程在发送了各自的redis请求分别获取到了对方的响应体. 复 ...

  4. idea 如何加入插件SonarLint

    idea 如何加入插件SonarLint   IDEA的插件安装有两种方法:一是在线安装:二是离线安装,即将插件的安装包下载以后从本地安装.   一.在线安装的过程:         1.打开IDEA ...

  5. vim 插件 入门

    vim 手册 vimtutor 精简版本 help user-manual 详细手册 一些vim自带设置 set nu "显示行号 set cursorline "高亮显示当前行 ...

  6. S4VM解析

    S4VM解析 2018年08月03日 15:20:59 stringlife 阅读数 1233   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. ...

  7. 3-MySQL DBA笔记-开发基础

    第二部分 开发篇 本篇首先讲述数据库开发的一些基础知识,如关系数据模型.常用的SQL语法.范式.索引.事务等,然后介绍编程开发将会涉及的数据库的一些技巧,最后结合生产实际,提供一份开发规范供大家参考. ...

  8. 8.SpringMVC注解式开发-HelloWorld

    第一个注解式开发程序 SpringMVC 是 Spring 框架的一部分,所以它和Spring结合的是非常紧密的 使用 @Controller 注解,既可以将处理器交给Spring容器去管理,又可以说 ...

  9. IDEA找不到maven仓库无法下载依赖解决办法

    1.确认Maven安装正常,在cmd窗口输入mvn -version 可以获得版本号: 2. 确认maven安装包下/conf/setting.xml配置文件正确 本地仓库位置: <localR ...

  10. Delphi 类的方法