news 2026/5/19 21:27:33

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/5/19 21:27:14

计算机毕设Java基于Web的应急救援医疗器材管理平台的设计与实现 基于Java Web的应急医疗设备管理系统的设计与开发 Java Web环境下应急救援医疗器械管理平台的构建与实现

计算机毕设Java基于Web的应急救援医疗器材管理平台的设计与实现3v25w9&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。 随着社会的快速发展&#xff0c;应急救援的重要性日益凸显…

作者头像 李华
网站建设 2026/5/19 21:27:14

AI写论文大推荐!4款AI论文生成工具,开启高效期刊论文写作之旅!

在2025年&#xff0c;学术写作逐渐进入智能化的新时代&#xff0c;越来越多的人选择借助AI写论文工具来完成他们的学术任务。当涉及到硕士和博士论文等较为复杂的长篇论文时&#xff0c;这些工具往往显示出不足之处。有些缺乏足够的理论深度&#xff0c;而另一些则在逻辑上显得…

作者头像 李华
网站建设 2026/5/10 0:59:20

【Matlab】MATLAB矩阵乘法运算详解:从行列匹配案例到线性变换计算应用

MATLAB矩阵乘法运算详解:从行列匹配案例到线性变换计算应用 在MATLAB数值计算体系中,矩阵乘法(也称为矩阵的线性乘法)是区别于元素级乘法的核心线性代数运算,核心规则是“前矩阵列数等于后矩阵行数”,运算逻辑遵循“行乘列求和”,是实现线性变换、线性方程组求解、数据…

作者头像 李华
网站建设 2026/5/13 15:12:32

注册表单必填项测试全解析:策略、场景与最佳实践

一、必填项测试的核心价值 在用户体验与数据完整性的交汇点&#xff0c;注册表单必填项是用户转化的第一道闸门。对测试人员而言&#xff0c;这不仅关乎字段验证逻辑&#xff0c;更涉及防呆机制设计、错误恢复能力及合规性保障&#xff08;如GDPR&#xff09;。漏测一个必填项…

作者头像 李华
网站建设 2026/5/14 3:23:26

基于Spring Boot的旅游网站系统毕业论文+PPT(附源代码+演示视频)

文章目录 一、项目简介1.1 运行视频1.2 &#x1f680; 项目技术栈1.3 ✅ 环境要求说明1.4 包含的文件列表 前台运行截图后台运行截图项目部署源码下载 一、项目简介 项目基于SpringBoot框架&#xff0c;前后端分离架构&#xff0c;后端为SpringBoot前端Vue。本文旨在开发一个基…

作者头像 李华
网站建设 2026/5/19 17:53:20

图像加载手动测试流程详解

在当今数字化时代&#xff0c;图像加载功能广泛应用于Web和移动应用&#xff08;如图片画廊、电商平台和社交媒体&#xff09;&#xff0c;其性能与可靠性直接影响用户体验。手动测试作为自动化测试的重要补充&#xff0c;能有效捕捉边界情况和用户交互问题。本文针对软件测试从…

作者头像 李华