(DP)51NOD 1183 编辑距离
第1行:字符串a(a的长度 <= 1000)。 第2行:字符串b(b的长度 <= 1000)。
输出a和b的编辑距离
kitten sitting
3解:具体介绍:https://www.51nod.com/tutorial/course.html#!courseId=3我们以矩阵形式实现了教程中的比较思想。以字符串dabcd和acdc为例,演示流程:(第二行与第二列预置,之后的数字由其对应行列字母与上,左,左上数字决定。 具体操作:首先比较对应行列字母,若一样则填入左上数据, 否则填入上,左,左上数字的最小值加一。)
1 #include<stdio.h> 2 3 4 char a[1005], b[1005]; 5 int dp[1005][1005]; 6 7 int min(int a, int b, int c) 8 { 9 b = b < a ? b : a; 10 return (c < b ? c : b); 11 } 12 13 int main() 14 { 15 while (scanf_s("%s%s", a, 1005, b, 1005) != EOF) 16 { 17 int i, j; 18 for (i = 0; i == 0 || a[i - 1] != 0; i++) 19 for (j = 0; j == 0 || b[j - 1] != 0; j++) 20 if (i == 0 || j == 0) dp[i][j] = i | j; 21 else if (a[i - 1] == b[j - 1]) dp[i][j] = dp[i - 1][j - 1]; 22 else dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]) + 1; 23 printf("%d\n", dp[i - 1][j - 1]); 24 } 25 return 0; 26 }
由于该方法顺序的检索顺序,我们可以优化空间消耗,减小数组dp的大小:
1 #include<stdio.h> 2 3 4 char a[1005], b[1005]; 5 int dp[2][1005]; 6 7 int min(int a, int b, int c) 8 { 9 b = b < a ? b : a; 10 return (c < b ? c : b); 11 } 12 13 int main() 14 { 15 while (scanf_s("%s%s", a, 1005, b, 1005) != EOF) 16 { 17 int i, j; 18 for (i = 0; 0 != a[i]; i++) dp[0][i + 1] = i + 1; 19 for (i = 1; 0 != a[i - 1]; i++) 20 { 21 dp[i & 1][0] = i; 22 for (j = 1; 0 != b[j - 1]; j++) 23 { 24 if (a[i - 1] == b[j - 1]) dp[i & 1][j] = dp[i + 1 & 1][j - 1]; 25 else dp[i & 1][j] = min(dp[i & 1][j - 1], dp[i + 1 & 1][j - 1], dp[i + 1 & 1][j]) + 1; 26 } 27 } 28 printf("%d\n", dp[i + 1 & 1][j - 1]); 29 } 30 return 0; 31 }
转载于:https://www.cnblogs.com/Ekalos-blog/p/9863789.html
(DP)51NOD 1183 编辑距离相关推荐
- 51Nod - 1183 编辑距离
问题:找出字符串的编辑距离,即把一个字符串s1最少经过多少步操作变成编程字符串s2,操作有三种,添加一个字符,删除一个字符,修改一个字符 解析: 首先定义这样一个函数--edit(i, j),它表示第 ...
- 【HDU - 1080】Human Gene Functions(dp,可编辑距离类问题)
题干: 给你两个DNA序列(长度不一定相同),你可以在其中任意位置上加入空格,使得最终他俩长度相同,最终相同长度的两个DNA序列会有个相似度比较(每个字符相对应的比较),问你如何放置这些空格使得总相似 ...
- LeetCode 712. 两个字符串的最小ASCII删除和(DP,类似编辑距离)
1. 题目 给定两个字符串s1, s2,找到使两个字符串相等所需删除字符的ASCII值的最小和. 示例 1: 输入: s1 = "sea", s2 = "eat" ...
- DP问题从入门到精通2.2(线性DP,最短编辑距离)
DP入门到精通系列 DP问题入门到精通1 DP问题入门到精通2.1 DP问题入门到精通3 DP问题入门到精通4 DP问题从入门到精通5 dp问题的难点到底是什么呢? 我认为是如何写出dp的更新方式,还 ...
- LeetCode 72. 编辑距离(DP)
1. 题目 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 . 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示 ...
- 51nod 基础题题解(全)
基础题(40): 1000 A + B 1005 大数加法 1006 最长公共子序列Lcs 1018 排序 1019 逆序数 1027 大数乘法 1046 A^B Mod C 1057 N的阶乘(大数 ...
- 代码随想录算法训练营Day56动态规划:583.两个字符串的删除操作,72.编辑距离
583.两个字符串的删除操作 文章链接:代码随想录 (programmercarl.com) 思路:动规五步曲 (1)确定dp数组及其含义 dp[i][j]表示字符串1在区间[0, i - 1]和字符 ...
- LeetCode 583. 两个字符串的删除操作(动态规划)
1. 题目 给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符. 示例: 输入: "sea" ...
- LeetCode 1143. 最长公共子序列(动态规划)
1. 题目 给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度. 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符 ...
最新文章
- java 模拟实现mq,RabbitMQ的5种模式,并使用java进行模拟操作
- Python - - 项目实战 -- pygame 快速入门
- [ZT]国家颁布防沉迷系统 网游三小时后经验减半
- java基础集合类之set
- 如何申请到利息低的贷款?
- Fast Image Cache – iOS 应用程序高性能图片缓存
- 使用Oracle做定时任务
- Linux系统有od程序吗,Linux od命令
- QGhappy小组第三次作业第二天完成情况
- java pppoe_ADSL(PPPOE)接入指南
- 抱歉,我也不知道程序员35岁以后该怎么办!
- 蔡康永的201堂情商课
- Java Web中Forward和redirect的区别
- bootstrap中固定table的表头
- 安装taro踩到小坑
- 极光开发者周刊【No.0806】
- 192-神以恩典为你年岁的冠冕
- 单页面应用和多页面应用
- 共赴数智金融未来,2023数智金融峰会即将召开
- 【Window10】解决win10家庭中文版找不到组策略gpedit.msc修改不了C盘文件
热门文章
- 性别从后台获取得值的那点事儿
- jquerynbsp;easyuinbsp;dateboxnbsp;的使用nbsp;.
- 如何通过代码注册或取消事件?
- 滑动门和翻转门实现的横竖双tab标签测试页面(附源码)
- 概述HTML文档的基本结构,HTML概述与基本结构
- kindeditor上传图片php,Kindeditor编辑器添加图片上传水印功能(php代码)
- python 手动读取cifar10_Python读入CIFAR-10数据库
- html缩进快捷键_HTML 入门笔记
- like mysql 相反_mysql真的不能做搜索引擎吗?
- matlab 转动惯量 叠加,一种汽车动力总成系统转动惯量合成方法