news 2026/4/2 4:18:26

leetcode 2977(Dijkstra + DP)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
leetcode 2977(Dijkstra + DP)

2977: 转换字符串的最小成本Ⅱ

思路:动态规划 + 图最短路径

  • 不相交性质:转换操作的子串要么完全相同,要么不相交。这意味着每个位置只需考虑直接转换到最终状态,无需考虑中间转换步骤。

  • 子串独立性:可以将问题分解为:将source的前i个字符变为target的前i个字符的最小代价。

class Solution { public: long long minimumCost(string source, string target, vector<string>& original, vector<string>& changed, vector<int>& cost) { int n=source.size(); set<int> lens; for(const auto& str:original) lens.insert(static_cast<int>(str.size())); unordered_set<string> orig(original.begin(),original.end()); unordered_set<string> chan(changed.begin(),changed.end()); //初始化dp vector<long long> dp(n+1,LONG_LONG_MAX); dp[0]=0; //构建图 unordered_map<string,vector<pair<string,int>>> graph; for(int i=0;i<original.size();i++){ graph[original[i]].emplace_back(changed[i],cost[i]); } //dijkstra单源最短路径 auto dijkstra=[&graph, &changed](string& src){ unordered_set<string> visited; unordered_map<string,long long> dist; for(const auto& dest:changed){ dist[dest]=LONG_LONG_MAX; } dist[src]=0; for(int i=0;i<changed.size();i++){ auto min_dist=LONG_LONG_MAX; string min_dest; for(const auto& [dest,dist]:dist){ if(!visited.contains(dest) && dist<min_dist){ min_dist=dist; min_dest=dest; } } if(min_dist==LONG_LONG_MAX) return dist; visited.insert(min_dest); dist[min_dest]=min_dist; for(const auto& [neighbour,weight]:graph[min_dest]){ if(!visited.contains(neighbour) && min_dist+weight<dist[neighbour]){ dist[neighbour]=min_dist+weight; } } } return dist; }; unordered_map<string,unordered_map<string,long long>> dist; for(int i=1;i<=n;i++){ int j=0; while(j<*lens.rbegin() && i-j-1>=0 && source[i-j-1]==target[i-j-1]){ dp[i]=min(dp[i],dp[i-j-1]); j++; } if(j==*lens.rbegin()) continue; //逐个尝试替换不同长度的子串 for(auto begin=lens.upper_bound(j);begin!=lens.end() && *begin<=i;begin++){ auto len=*begin; auto src=source.substr(i-len,len); auto dest=target.substr(i-len,len); if(src!=dest && orig.contains(src) && chan.contains(dest) && dp[i-len]!=LONG_LONG_MAX){ if(!dist.contains(src)) dist[src]=dijkstra(src); if(dist[src][dest]!=LONG_LONG_MAX){ dp[i]=min(dp[i],dp[i-len]+dist[src][dest]); } } } } return dp[n]==LONG_LONG_MAX ? -1:dp[n]; } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/15 4:19:50

HY-Motion 1.0环境部署:开源镜像免配置+Python调用代码实例

HY-Motion 1.0环境部署&#xff1a;开源镜像免配置Python调用代码实例 1. 为什么你需要HY-Motion 1.0——不是又一个“能动”的模型&#xff0c;而是真正能进管线的3D动作生成器 你有没有试过在Blender里手动K帧做一段5秒的跑步动画&#xff1f;或者在Unity中反复调整IK权重&…

作者头像 李华
网站建设 2026/3/28 2:11:23

计算机毕设java的老年公寓管理系统 基于Java的智能老年公寓信息管理系统设计与实现 Java驱动的老年公寓综合管理平台开发

计算机毕设java的老年公寓管理系统ezle69 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。 随着社会老龄化的加剧&#xff0c;老年公寓作为老年人生活的重要场所&#xff0c;其管…

作者头像 李华
网站建设 2026/3/28 0:46:13

嵌入式毕业设计最全开题报告100例

【单片机毕业设计项目分享系列】 &#x1f525; 这里是DD学长&#xff0c;单片机毕业设计及享100例系列的第一篇&#xff0c;目的是分享高质量的毕设作品给大家。 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的单片机项目缺少创新和亮点…

作者头像 李华
网站建设 2026/3/31 19:52:17

退货流程手动验证操作指南面向软件测试从业者的核心场景与策略

一、手动验证的核心关注点 流程完整性验证 端到端链路覆盖&#xff1a;从用户提交申请→商家审核→物流操作→库存/财务更新→用户退款&#xff0c;验证各环节状态同步与数据一致性。 关键节点检查&#xff1a; 退货原因合法性校验&#xff08;如质量问题需强制上传凭证&#…

作者头像 李华
网站建设 2026/4/1 12:57:11

大数据毕设本科生方向100例

0 选题推荐 - 云计算篇 毕业设计是大家学习生涯的最重要的里程碑&#xff0c;它不仅是对四年所学知识的综合运用&#xff0c;更是展示个人技术能力和创新思维的重要过程。选择一个合适的毕业设计题目至关重要&#xff0c;它应该既能体现你的专业能力&#xff0c;又能满足实际应…

作者头像 李华
网站建设 2026/3/13 4:51:13

2026美赛MCM/ICM C题与星共舞数据分析附思路和Matlab参考代码

点击上方蓝字关注我 ✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书和数…

作者头像 李华