787. K 站中转内最便宜的航班 | 514.自由之路

2023-10-18 23:40
文章标签 自由 航班 便宜 中转 787 514

本文主要是介绍787. K 站中转内最便宜的航班 | 514.自由之路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

有 n 个城市通过一些航班连接。给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格 pricei 抵达 toi。

现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到出一条最多经过 k 站中转的路线,使得从 src 到 dst 的 价格最便宜 ,并返回该价格。 如果不存在这样的路线,则输出 -1。

示例 1:

输入: 
n = 3, edges = [[0,1,100],[1,2,100],[0,2,500]]
src = 0, dst = 2, k = 1
输出: 200
解释: 
城市航班图如下


从城市 0 到城市 2 在 1 站中转以内的最便宜价格是 200,如图中红色所示。
示例 2:

输入: 
n = 3, edges = [[0,1,100],[1,2,100],[0,2,500]]
src = 0, dst = 2, k = 0
输出: 500
解释: 
城市航班图如下


从城市 0 到城市 2 在 0 站中转以内的最便宜价格是 500,如图中蓝色所示。

思路:动态规划 

注意边界判断和函数的返回值 

旅游省钱大法:加权最短路径 :: labuladong的算法小抄 (gitee.io)

class Solution {
public:unordered_map<int,vector<pair<int,int>>> indegree;int src;vector<vector<int>> memo;int findCheapestPrice(int n, vector<vector<int>>& flights, int src, int dst, int k) {memo.resize(n,vector<int>(k+2,-1000));this->src=src;for(auto& flight:flights)//存储每个结点的入度以及边的权值{int from=flight[0];int to=flight[1];int price=flight[2];indegree[to].emplace_back(from,price);}return dp(dst,k+1);}//dp函数定义:从src出发,在k步之内到达dst的最便宜的价钱int dp(int dst,int k){if(src==dst)//base casereturn 0;if(k<=0)//步数不够,无法到达return -1;if(memo[dst][k]!=-1000)//备忘录,减少重复计算return memo[dst][k];int res=INT_MAX;for(pair<int,int>& i:indegree[dst])//动态转移{int pre=i.first;int price=i.second;int subProblem=dp(i.first,k-1);if(subProblem!=-1)res=min(res,subProblem+price);}if(res!=INT_MAX)memo[dst][k]=res;else//res在此处仍为INT_MAX,说明dst的入度为0或者步数不足,两者都代表无法到达memo[dst][k]=-1;return memo[dst][k];}
};

 514.自由之路

电子游戏“辐射4”中,任务 “通向自由” 要求玩家到达名为 “Freedom Trail Ring” 的金属表盘,并使用表盘拼写特定关键词才能开门。

给定一个字符串 ring ,表示刻在外环上的编码;给定另一个字符串 key ,表示需要拼写的关键词。您需要算出能够拼写关键词中所有字符的最少步数。

最初,ring 的第一个字符与 12:00 方向对齐。您需要顺时针或逆时针旋转 ring 以使 key 的一个字符在 12:00 方向对齐,然后按下中心按钮,以此逐个拼写完 key 中的所有字符。

旋转 ring 拼出 key 字符 key[i] 的阶段中:

您可以将 ring 顺时针或逆时针旋转 一个位置 ,计为1步。旋转的最终目的是将字符串 ring 的一个字符与 12:00 方向对齐,并且这个字符必须等于字符 key[i] 。
如果字符 key[i] 已经对齐到12:00方向,您需要按下中心按钮进行拼写,这也将算作 1 步。按完之后,您可以开始拼写 key 的下一个字符(下一阶段), 直至完成所有拼写。
 

示例 1:


输入: ring = "godding", key = "gd"
输出: 4
解释:
 对于 key 的第一个字符 'g',已经在正确的位置, 我们只需要1步来拼写这个字符。 
 对于 key 的第二个字符 'd',我们需要逆时针旋转 ring "godding" 2步使它变成 "ddinggo"。
 当然, 我们还需要1步进行拼写。
 因此最终的输出是 4。


示例 2:

输入: ring = "godding", key = "godding"
输出: 13

思路:动态规划 

动态规划帮我通关了《辐射4》 :: labuladong的算法小抄 (gitee.io) 

class Solution {
public:unordered_map<char,vector<int>> charToIndex;vector<vector<int>> memo;int findRotateSteps(string ring, string key) {memo.resize(ring.size(),vector<int>(key.size(),-1));for(int i=0;i<ring.size();i++){charToIndex[ring[i]].push_back(i);}return dp(ring,key,0,0);}//dp函数定义:指针指向ring[i],拼出key[j..]所需的最少步数int dp(string& ring,string& key,int i,int j){if(j>=key.size())//base case{return 0;}int res=INT_MAX;if(memo[i][j]!=-1){return memo[i][j];}for(int k:charToIndex[key[j]])//key[j]在ring中可能对应着多个位置{int delta=abs(k-i);//因为ring.size()的返回值没有规定类型//所以ring.size()-delta的类型也就没有规定,和min函数参数类型不符,应该强制类型转换delta=min(delta,(int)(ring.size()-delta));//选择顺时针还是逆时针int subProblem=dp(ring,key,k,j+1);//将指针拨到ring[k],拼出key[j+1..]的最小步数res=min(res,subProblem+delta+1);//加一是因为按下按钮也是一次操作}memo[i][j]=res;return res;}
};

这篇关于787. K 站中转内最便宜的航班 | 514.自由之路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/235847

相关文章

创建一个大的DIV,里面的包含两个DIV是可以自由移动

创建一个大的DIV,里面的包含两个DIV是可以自由移动 <body>         <div style="position: relative; background:#DDF8CF;line-height: 50px"> <div style="text-align: center; width: 100%;padding-top: 0px;"><h3>定&nbsp;位&nbsp;

1800 万,财务自由了

《黑神话:悟空》 距离《黑神话:悟空》上线(8 月 20 日)上线已过去半个月,从刚开始全网热议,连官方都下场点评,到现在的逐渐回归平静。 不是游戏圈或是对数据不敏感的网友,可能会落入《黑神话:悟空》已经开始失势的"错觉"中。 但实际上,《黑神话:悟空》还在持续不断的创造新历史。 据最新的机构统计数据显示,《黑神话:悟空》上市两周,销量已突破 1800 万份,营销收入高达 8.67 亿美元

我酸了,蚂蚁上市,财富自由都是他们的4、蚂蚁金服上市,算算你离财富自由还有多远?...

蚂蚁金服要上市的消息,大家应该都听说了。数据显示,上市后阿里及蚂蚁员工可能将诞生 5000 个千万富翁,500个亿万富翁!你看这数字,每一个 0 都是财富自由的象征。 我算了一笔账。如果你月入 2 万+ ,想要身价过千万,你至少需要努力 50 多年;如果你月入 1 万 5 ,至少需要努力 80 多年;如果你月入还没有过万,你可能需要 “ 做梦 ” 。 今天简单点,想说的就是:有的时候,做梦也是

Floorp Browser:开源自由,打造更个性化的浏览环境!

前言 "技术引领未来,创新改变世界。" 在这个日新月异的数字化时代,网络浏览器作为我们探索互联网世界的窗口,其重要性不言而喻。正是在这样的背景下,Floorp浏览器应运而生,它不仅继承了Mozilla Firefox的强大基因,更在此基础上进行了创新与优化,旨在为用户打造一个更加开放、私密且可持续的网络环境。 项目的诞生,源自于一群对技术充满热情、对互联网未来满怀憧憬的开发者。他们看到了当前网

安卓aosp14上自由窗口划线边框Freeform Caption实战开发-千里马framework实战

背景: 上一篇文章也分享过aosp14版本上自由窗口的Caption栏的显示原理,今天来讲解一下aosp14版本上如何实现对自由窗口的划线边框功能,相关功能已经在aosp13上面进行实现,具体可以看我的分屏自由窗口专题哈。 就是想要在aosp14上面实现如下功能: 即自由窗口在被触摸放大缩小时候,边框要被画成红色的线条,表示选中。 尝试aosp13老方案: 因为aosp13是在acti

Mapmost让你实现地图标注自由

最近在勤勤恳恳(moyuhaushui)搬砖之余,偶然间看到一个在线古籍图书馆,虽然对文言文阅读的心理障碍不亚于英文阅读理解,但网站中有很多历史图集还是引起了兴趣。比如这幅《水经注图》,顺藤摸瓜的瞧,才理解《水经注图》是以《水经注》为基础绘制的一部历史地理地图集,由清代杨守敬与熊会贞编绘。而我们课本中学过的《三峡》取自《水经注》,由北魏地理学家郦道元所撰,《水经注》名为对《水经》的注解,但实际上是

最近2个月捡漏买到很便宜但是很好用的几样物品

纯分享得瑟贴子哈哈 做为一个mou鱼和多多的重度用户,我日常生活的一个乐趣就是捡漏,日常说法也可以叫喜欢买便宜货,下面我列举一些最近2个月买到过的很值的东西: 电动摩托车380元,之前在多多买了一个类似的1500,但是由于商家给我发错了型号所以退了,然后后来机缘巧合,买到了这个,前主人买了一年了,骑的次数非常少,所以很新,轮胎胎毛都还在。 每日通勤成本一下子降低到了5毛钱,还不用忍受堵车

飞燕草花语探秘:从清静到自由的多元寓意解读

当我们走近飞燕草,细细品味它的每一个细节,从那娇艳的花朵到那嫩绿的叶片,无不让人沉醉其中。而最令人着迷的,当属它所蕴含的丰富花语,这些花语如同一个个神秘的密码,等待着我们去解读和探寻。 一、飞燕草花语的多元阐释  飞燕草常见的花语有清静、轻盈、正义、自由等。 “清静” 这一花语,反映出飞燕草所具有的那种宁静、淡泊的气质。它不与百花争艳,独自绽放出属于自己的美丽,给人一种宁静致远的感受

蔡司小乐圆镜片:自由环面与微柱镜排布助力兼顾舒适与效果

从学习到休闲娱乐,孩子们的日常生活已与电子设备密不可分,视力面临日益严峻的挑战。为了让孩子拥有全视野清晰视觉体验的同时,更有效管理孩子的近视发展,让孩子佩戴蔡司小乐圆镜片,也成为不少家长的首选。 数据统计,有98%的孩子都能在一天之内适应蔡司小乐圆的佩戴,蔡司小乐圆镜片是通过哪些设计保障良好的适应性和舒适度的呢? 1、蔡司自由环面设计加持 蔡司自由环面设计,通过眼球旋

盘点大模型中转 API 平台,并比较费用

1. 大模型中转 API 平台集合 1.1 DevAGI DevAGI开放平台 Open AI 价格 1.2 Deepbricks 官网价格 1.3 AiHubMix AiHubMix 官网 使用教程 价格: 1.4 WildCard 开卡订阅 WildCard官网 价格 有3.5% 的充值手续费,API 价格与 Open AI 一样 2. 价格对比 OpenAI