题目描述

设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为”abcbcd”,则字符串“abcb□cd”,“□a□bcbcd□”和“abcb□cd□”都是X的扩展串,这里“□”代表空格字符。

如果A1是字符串A的扩展串,B1是字符串B的扩展串,A1与B1具有相同的长度,那么我扪定义字符串A1与B1的距离为相应位置上的字符的距离总和,而两个非空格字符的距离定义为它们的ASCII码的差的绝对值,而空格字符与其他任意字符之间的距离为已知的定值K,空格字符与空格字符的距离为0。在字符串A、B的所有扩展串中,必定存在两个等长的扩展串A1、B1,使得A1与B1之间的距离达到最小,我们将这一距离定义为字符串A、B的距离。

请你写一个程序,求出字符串A、B的距离。

输入输出格式

输入格式:

输入文件第一行为字符串A,第二行为字符串B。A、B均由小写字母组成且长度均不超过2000。第三行为一个整数K(1≤K≤100),表示空格与其他字符的距离。

输出格式:

输出文件仅一行包含一个整数,表示所求得字符串A、B的距离。

输入输出样例

输入样例#1:

cmc
snmn
2

输出样例#1: 
10

Solution

很显然我还是欠缺了一些思路.这个DP我只想出来一半.后面还好是看了题解,其实思路一样.就是我预处理有一些问题.

作为一道DP题来看的话,这道题其实不是很难.

我们以 f [ i ] [ j ] 作为状态,也就是第一个字串的第 i 位和第二个字符串的第 j 位 的最优解.

读完题就可以知道每一个位置的字符只有两种情况 :

1.当前第一个字符串里第 i 的字符与一个空格匹配.

2.当前第一个字符串里第 i 的字符与第二个字符串里面第 j 个字符匹配.

也就是说 每个 f [ i ] [ j ] 有三种前导状态:

1. f [ i-1 ] [ j ] 此时也就是第一个字符串的第 i 个与一个空格匹配.

2. f [ i ] [ j-1 ] 此时是第二个字符串的第 j 个与一个空格匹配.

3. f [ i-1 ] [ j-1 ]  此时也就是当前 i 和 j 两个字符匹配即可.

所以动态转移方程就可以推出来了.

需要注意的是预处理. 需要兼顾到每一个字符与一个空串的匹配状况.

代码

#include<bits/stdc++.h>
using namespace std;
int f[2008][2008];
char ch1[2008],ch2[2008];
int len1,len2,kk;
int main()
{scanf("%s",ch1);scanf("%s",ch2);cin>>kk;len1=strlen(ch1);len2=strlen(ch2);for(int i=1;i<=len1;i++) f[i][0]=f[i-1][0]+kk;for(int i=1;i<=len2;i++) f[0][i]=f[0][i-1]+kk;//预处理部分需要注意for(int i=1;i<=len1;i++)for(int j=1;j<=len2;j++){f[i][j]=min(min(f[i-1][j]+kk,f[i][j-1]+kk),f[i-1][j-1]+abs(ch1[i-1]-ch2[j-1]));}cout<<f[len1][len2]<<endl;return 0;
}

转载于:https://www.cnblogs.com/Kv-Stalin/p/8856071.html

P1279 字串距离 (动态规划)相关推荐

  1. P1279 字串距离【动规】

    P1279 字串距离 link 思路: 设f[i][j]表示A字符串为i的前缀,B字符串为j的前缀的最小距离. 对于f[i][0](i ~ l e n A ) len_A) lenA​), f[0][ ...

  2. 洛谷P1279 字串距离 (动态规划)

    题目描述 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为"abcbcd",则字符串"abcb□cd"," ...

  3. 【DP】字串距离(luogu 1279)

    字串距离 luogu 1279 题目大意 给出两个字符串,让你加上若干空格,使其长度相同 对于第i位,如果都是字母那代价就是ASCII码的差值,如果一个是字母那就是k,如果没有一个是字母那就是0,让你 ...

  4. 洛谷1279 字串距离

    题目描述 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为"abcbcd",则字符串"abcb□cd"," ...

  5. 最长公共子序列(LCS)问题 Longest Common Subsequence 与最长公告字串 longest common substr...

    问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X="x0,x1,-,xm-1",序列Y=& ...

  6. 字符串相关处理kmp,前缀数,后缀树,后缀数组,最长回文串,最长重复字串,最长非重复字串

    1. 最长回文串 一般用后缀数组或者后缀树可以解决, 用此方法:http://blog.csdn.net/v_july_v/article/details/6897097 预处理后缀树,使得查询LCA ...

  7. leetcode必刷题(四)lee75 颜色分类、lee76 最小覆盖字串、lee78 子集、lee79 单词搜索、lee84 柱状图中最大的矩形、lee85 最大矩形、lee96 不同的二叉搜索树、

    lee75 颜色分类 patition 三个指针 lee76 最小覆盖字串 滑动窗口 lee78 子集 无重复数字 回溯 lee79 单词搜索 回溯 lee84 柱状图中最大的矩形 单调栈 lee85 ...

  8. LeetCode中等题之无重复字符的最长字串

    题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 &q ...

  9. 使用XML在MSSQL把字串分解

    今天要在mssql里处理一串Email地址.以分号分开的.以前自己写过一个split函数的.这次想使用xml来处理. mssql 2000和mssql 2005数据库对xml的支持有些不同.至少mss ...

最新文章

  1. How does SGD weight_decay work?
  2. echarts 饼图每块颜色_读者提问,如何让 tooltip 提示框内显示饼图
  3. java日期大小比较(亲测)
  4. 单点登录Redis存储Session及SessionId问题说明与集群实战-4
  5. 【2020牛客NOIP赛前集训营-提高组(第二场)】题解(GCD,包含,前缀,移动)
  6. IIS+ASP部署相关
  7. linux bash 获取 国内常见网站的IP列表
  8. Nordic Blue Tooth
  9. 程序员人生:技术人员的职业发展规划
  10. 前端偶数行有底纹怎么写_如何在Excel中的替代行上应用底纹
  11. 桌面放大镜、演示工具推荐——ZoomIt
  12. mysql 赋权_《MySQL数据库》MySQL用户赋权
  13. iOS8 定位新增功能
  14. 微信公众号图片素材一键删除小工具
  15. 3.1 该如何编写程序界面
  16. iphone计算机能算度分秒吗,‎App Store 上的“iFxCalc:最人性化的函数计算器,支持自定义中文函数”...
  17. java对接旺店通数据同步
  18. 如何避免编程从入门到放弃?
  19. 线程局部变量 ThreadLocal
  20. Qt Creator Windows 修改外观字体

热门文章

  1. 苹果air3安兔兔html5是什么,iPad Air3什么时候上市?我们期待的苹果iPad Air3是什么样?(2)...
  2. 在 k8S 中搭建 SonarQube 7.4.9 版本(使用 PostgreSQL 数据库)
  3. “杭银理财”杯浙江工业大学大学生程序设计竞赛暨全国邀请赛 签到题9题
  4. 【软考】《希赛教育·软件设计师考前冲刺与考点分析》计算机硬件基础知识——学习笔记
  5. 2021牛客暑期多校训练营3,签到题BEFJ
  6. 【NOIP2001】【Luogu1027】Car的旅行路线
  7. linux shell rsync,linux – 如何在我的下面的shell脚本中使用rsync而不是scp来复制文件?...
  8. 贪心算法无重叠区间c语言,贪心算法之区间问题.md
  9. 服务器开机信号,机柜服务器BMC开关机控制系统及方法
  10. 单通道图像保存_3D图像展示篇结构更清晰