P1279 字串距离 (动态规划)
题目描述
设有字符串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的距离。
输入输出样例
cmc
snmn
2
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[][];
char ch1[],ch2[];
int len1,len2,kk;
int main()
{
scanf("%s",ch1);
scanf("%s",ch2);
cin>>kk;
len1=strlen(ch1);
len2=strlen(ch2);
for(int i=;i<=len1;i++) f[i][]=f[i-][]+kk;
for(int i=;i<=len2;i++) f[][i]=f[][i-]+kk;
//预处理部分需要注意
for(int i=;i<=len1;i++)
for(int j=;j<=len2;j++)
{
f[i][j]=min(min(f[i-][j]+kk,f[i][j-]+kk),f[i-][j-]+abs(ch1[i-]-ch2[j-]));
}
cout<<f[len1][len2]<<endl;
return ;
}
P1279 字串距离 (动态规划)的更多相关文章
- P1279 字串距离
P1279 字串距离一看就是字符串dp,然而并不会,骗分之后爆零了.以后dp题要好好想想转移方程.f[i][j]表示是a串选了前i个字符,b串选了前j个字符的距离.显然(QAQ)f[i][j]=min ...
- P1279 字串距离 dp 洛谷
题目描述 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为”abcbcd”,则字符串“abcb□cd”,“□a□bcbcd□”和“abcb□cd□”都是X ...
- 洛谷P1279 字串距离
题目描述 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为”abcbcd”,则字符串“abcb□cd”,“□a□bcbcd□”和“abcb□cd□”都是X ...
- 洛谷 P1279 字串距离 题解
每日一题 day24 打卡 Analysis 字符串+dp 仔细观察发现,对于f[i][j],它的值为以下三个值中的最小者: f[i-1][j]+k //a[i]对应空格 f[i][j-1]+k // ...
- [洛谷P1279][题解]字串距离
题目戳我 很明显的这题是一道dp,主要讲一下几个细节 1.初始化 我们需要初始化边界情况也就是一个字符串为空的情况 #----------# #----------# A:aaaaaa A:□□□□□ ...
- luogu[1279]字串距离
题目描述 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为”abcbcd”,则字符串“abcb□cd”,“□a□bcbcd□”和“abcb□cd□”都是X ...
- RQNOJ 514 字串距离:dp & 字符串
题目链接:https://www.rqnoj.cn/problem/514 题意: 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为”abcbcd”,则字 ...
- 动态规划--求最大连续子数组的和(Python实现)&求解最大连续乘积字串(Python实现)
def MaxSum(self,array,n): sum=array[0] result=array[0] for i in range(0,n): if sum<0: sum=a[i] el ...
- python-Levenshtein几个计算字串相似度的函数解析
linux环境下,没有首先安装python_Levenshtein,用法如下: 重点介绍几个该包中的几个计算字串相似度的几个函数实现. 1. Levenshtein.hamming(str1, str ...
随机推荐
- ajax传给springMVC数据编码集问题
前台 ajax: $.ajax("${pageContext.request.contextPath}/hello",// 发送请求的URL字符串. { dataType : &q ...
- codevs 1008 选数
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n).从 n ...
- SAP云平台,Netweaver,Kubernetes和C4C的用户和角色关系
SAP云平台 Netweaver 同SAP云平台一样,在事务码PFCG里维护角色: 然后在事务码SU01里将多个角色分配给用户: Kubernetes Kubernetes在1.3版本中发布了alph ...
- vue2.0动画
相对于vue1.0来说,vue2.0的动画变化还是挺大的, 在1.0中,直接在元素中加 transition ,后面跟上名字. 而在vue2.0中,需要把设置动画的元素.路由放在<transit ...
- caffe的pad的报错
CHECK((!conv_param.has_stride() && conv_param.has_stride_h() && conv_param.has_strid ...
- Flask——蓝图
蓝图介绍 一个项目中,有不同的模块,但是只有一个入口,程序入口可以随便取名,一般叫做,app.py或者manage.py.当我们写一个程序,当然可以在一个文件中写完,但是有一定规模的项目,我们肯定不会 ...
- Php教程
第一部:PHP基础部分(131集,发布完毕) 讲html与PHPt基础,PHP环境搭建,与留言本编写. 下载地址:① HTML视频[2014新版] http://pan.baidu.com/s/1ve ...
- Spring根据XML配置文件注入属性 其实也是造bean,看看是使用constructor还是setter顺带完成属性赋值
方法一使用setter方法 package com.swift; public class Book { private String bookName; public void setBook(St ...
- MySQL中数组的存储
1. MySQL中以字符串的形式存储数组 MySQL中无数组类型,通常将数组元素按某个字符分割以字符串形式存储 1.1. 求数组中元素的个数 方法:按指定符号分割字符串,返回分割后的元素个数.方法很简 ...
- 【OS_Linux】清空终端屏幕的方法
使用clear命令或Ctrl+L组合键来清空终端屏幕,它不是真正的清空了,而是给人以错觉,当向上滚动鼠标后发现屏幕的内容依然在. 使用printf '\033c'才真正意义上清空了屏幕,它同DOS下的 ...