当前位置: 首页 > news >正文

P1279 字串距离【洛谷算法习题】

P1279 字串距离

网页链接

P1279 字串距离

题目描述

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

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

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

输入格式

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

输出格式

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

输入输出样例 #1

输入 #1

cmc snmn 2

输出 #1

10

解题思路

本题核心是动态规划(DP),本质是变形的编辑距离问题,求解两字符串扩展后的最小匹配距离。定义dp[i][j]为字符串A前i个字符、字符串B前j个字符匹配后的最小距离。状态转移有三种情况:A第i字符匹配B第j字符,累加ASCII差绝对值;A第i字符匹配空格,加定值K;B第j字符匹配空格,加定值K。初始化边界:dp[i][0]dp[0][j]分别为全空格匹配的代价。算法时间复杂度O ( l e n ( A ) × l e n ( B ) ) O(len(A)×len(B))O(len(A)×len(B)),完美适配字符串长度≤2000的数据范围。

总结

核心逻辑:动态规划模拟字符与空格的三种匹配方式,取最小代价。
关键操作:定义DP状态、三种转移方程、边界初始化。
效率保障:二维DP线性遍历,400万次运算高效通过,无超时风险。

代码内容

#include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'typedeflonglongll;typedefunsignedlonglongull;typedefvector<vector<ll>>vvt;typedefpair<ll,ll>pll;constll N=1e3+10;constll INF=1e18;constll M=1e6+10;constll mod=1e9+7;intmain(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);string s1,s2;ll k;cin>>s1>>s2>>k;ll l1=s1.size(),l2=s2.size();vector<ll>a(l1+1),b(l2+1);for(ll i=0;i<l1;i++)a[i+1]=s1[i];for(ll i=0;i<l2;i++)b[i+1]=s2[i];vector<vector<ll>>f(l1+1,vector<ll>(l2+1,INF));for(ll i=1;i<=l1;i++)f[i][0]=i*k;for(ll i=1;i<=l2;i++)f[0][i]=i*k;f[0][0]=0;for(ll i=1;i<=l1;i++){for(ll j=1;j<=l2;j++){f[i][j]=min(f[i][j],f[i][j-1]+k);f[i][j]=min(f[i][j],f[i-1][j]+k);f[i][j]=min(f[i][j],f[i-1][j-1]+abs(a[i]-b[j]));}}cout<<f[l1][l2]<<endl;return0;}
http://www.jsqmd.com/news/841319/

相关文章:

  • 终极指南:如何用番茄小说下载器三步解决数字阅读碎片化难题
  • listmonk数据库查询缓存键命名规范:一致性与可读性
  • listmonk容器日志轮转配置:避免磁盘空间耗尽
  • 通过curl命令直接调用Taotoken聚合API的快速排错指南
  • 从NoClassDefFoundError到NoSuchMethodError:一次完整的EasyExcel与POI版本冲突排查与解决之旅
  • 鸡西旧黄金回收旧银饰回收PT950铂金回收钻戒回收金银铂钻回收高价多少钱一克同城价格查询上门上门估价闲置变现转让靠谱权威排行榜 - 检测回收中心
  • vs2019 - 从手工签名到自动化:signtool脚本实践与排错指南
  • DLT Viewer高效配置:专业诊断日志分析实战指南
  • TitleBar事件监听完全手册:左中右点击处理的10个实战技巧
  • Python量化交易数据获取难题的终极解决方案:mootdx让通达信数据读取变得简单高效
  • 昆明投资金条回收上门回收白银上门铂金回收旧钻石回收周边金银回收高价多少钱一克同城价格查询上门上门估价闲置变现转让靠谱权威排行榜 - 检测回收中心
  • 知识图谱冷启动失败率高达68%?NotebookLM构建中的3类隐性数据断层及实时修复方案
  • 终极指南:使用YOLOv8 AI瞄准辅助工具提升FPS游戏水平
  • 吉安黄金吊坠回收同城白银回收同城铂金回收钻石首饰回收本地贵金属回收高价多少钱一克同城价格查询上门上门估价闲置变现转让靠谱权威排行榜 - 检测回收中心
  • 浏览器音乐解锁完整教程:5分钟掌握加密音频解密技巧
  • 【我的stm32开发之路-实践篇-嵌入式的hello-world】原创
  • 吉安黄金戒指回收白银首饰回收高价铂金回收品牌钻戒回收二手白银回收高价多少钱一克同城价格查询上门上门估价闲置变现转让靠谱权威排行榜 - 检测回收中心
  • PUA-Mean-Editor:专为数据科学家打造的均值处理工具
  • 克隆虚拟机后磁盘变厚?`vmkfstools`手动转薄教程
  • 3大核心价值|5步实战操作|7类场景解析:如何通过DLSS Swapper实现游戏性能优化
  • 172 号卡官方唯一推荐码 10000!五位数首码真伪鉴别|正规号卡分销平台避坑指南 - 172号卡
  • Chai-1约束功能完全指南:如何精确控制分子折叠过程
  • 遥感影像分割中类别不均衡?试试用PyTorch实现Focal Loss,我的mIoU提升了5%
  • 中文AI智能体开发指南:基于Hermes模型与开源资源库实践
  • 济南旧黄金回收旧银饰回收PT950铂金回收钻戒回收金银铂钻回收高价多少钱一克同城价格查询上门上门估价闲置变现转让靠谱权威排行榜 - 检测回收中心
  • 终极Total War模组管理器:5步快速创建你的第一个游戏模组
  • 大模型产品经理学习路线,从零到精通:AI大模型产品经理的进阶学习路线图!
  • J-Link RTT调试实战:从基础配置到高效日志系统构建
  • Qt QSS 不是 CSS,项目里最容易栽在这几个细节上
  • React计算优化终极方案:useMemo与Worker线程的黄金组合