电子游戏“辐射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 的下一个字符(下一阶段), 直至完成所有拼写。
示例:

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/freedom-trail
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

很难想的一道dp

主要问题是很难想状态转移方程,以及如何构建dp矩阵。 给出两个序列 ring 和 key,我想到了dp矩阵应该用二维,而且第一维 i i i应该用来描述已经拼写完成的字符的下标。剩下的就不知道了。

题解中是这样描述的:

定义 d p [ i ] [ j ] dp[i][j] dp[i][j] 表示从前往后拼写出 k e y key key 的第 i i i 个字符时, r i n g ring ring 的第 j j j 个字符与 12:00 方向对齐的最少步数(下标均从 0 开始)。

这里注意,比如当key的第i个字符s被拼写完成时,ring 对应12点的字符必定也是s,只不过ring上可能有多个s,且s在ring 上的下标随意。

因此,在dp矩阵中,一行不能全部遍历,因为有的位置是达不到的。所以在循环的时候,内层的循环不是从0到结束的。

完整题解:

class Solution {public:unsigned abs(unsigned a) {return a > 0 ? a : -a;}unsigned min(unsigned a, unsigned b) {return a < b ? a : b;}unsigned findRotateSteps(string ring, string key) {unsigned rl = ring.size();unsigned kl = key.size();unsigned dp[103][103];vector<unsigned> pos[26];for (unsigned i=0;i<rl;++i) {pos[ring[i]-'a'].push_back(i);}memset(dp, 0x7f, sizeof(dp));for (auto& i : pos[key[0]-'a']) {dp[0][i] = min(i, rl-i) + 1;}for(unsigned i=1;i<kl;++i) {// for (int j=0;j<rl;++j) { 这样写是错的for (auto& j : pos[key[i]-'a']) {for (auto& k : pos[key[i-1]-'a']) {dp[i][j] = min(dp[i][j], dp[i-1][k] + min(abs(j-k), rl-abs(j-k)) + 1);}}}unsigned ans = 999999999;for (unsigned i=0;i<rl;++i) {if (dp[kl-1][i] < ans)ans = dp[kl-1][i];}return ans;}
};

leetcode 动态规划 514. 自由之路相关推荐

  1. leetcode:514. 自由之路

    题目来源 leetcode:514. 自由之路 题目描述 class Solution {public:int findRotateSteps(string ring, string key) {} ...

  2. 【Leetcode 每日一题】514. 自由之路(BFS+优先队列)

    Leetcode 每日一题 题目链接:514. 自由之路 难度: 困难 解题思路: 这道题乍一看,可以选择用动态规划或者BFS来求解.本文使用BFS来进行解答.注意到题中有一个最小的到路径.所以我们可 ...

  3. LeetCode 514. 自由之路(记忆化递归 / DP)

    文章目录 1. 题目 2. 解题 1. 题目 电子游戏"辐射4"中,任务"通向自由"要求玩家到达名为"Freedom Trail Ring" ...

  4. leetcode【每日一题】514. 自由之路 Java【待完成

    题干 视频游戏"辐射4"中,任务"通向自由"要求玩家到达名为"Freedom Trail Ring"的金属表盘,并使用表盘拼写特定关键词才能 ...

  5. leecode 514. 自由之路

    题目描述 电子游戏"辐射4"中,任务 "通向自由" 要求玩家到达名为 "Freedom Trail Ring" 的金属表盘,并使用表盘拼写特 ...

  6. 【LeetCode】自由之路 [H](记忆化搜索)

    514. 自由之路 - 力扣(LeetCode) 一.题目 电子游戏"辐射4"中,任务 "通向自由" 要求玩家到达名为 "Freedom Trail ...

  7. LeetCode_514_自由之路

    题目:自由之路 难度:困难 514.自由之路 电子游戏"辐射4"中,任务"通向自由"要求玩家到达名为"Freedom Trail Ring" ...

  8. 卖萌屋算法岗面试手册上线!通往面试自由之路

    一只小狐狸带你解锁 炼丹术&NLP 秘籍 作为算法工程师,基础知识的重要性自然不必多说.虽然在有些项目中比较难感受到基础的作用,但扎实的coding能力,对算法本质和适用情况的理解,始终是决定 ...

  9. Leetcode动态规划部分典型题目分类及总结

    参考内容 https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zhong-xin-kuo-san-dong- ...

最新文章

  1. 【高并发、高性能、高可用】系统设计经验分享!
  2. 道家遁甲式(又名道家奇门)
  3. 多线程:Immutable对象?如何创建Immutable对象?
  4. java异步处理_SpringBoot异步开发之异步请求,在高并发的情况下,提高性能
  5. 微信小程序 长按图片不出现菜单_微信小程序实现长按删除图片的示例
  6. 前端学习(2305):react之脚手架基本创建
  7. 推出云游戏解决方案后,腾讯在这场沙龙上还说了什么?
  8. 使用SpringMVC模拟文件上传与下载案例
  9. 如何应对被地下的Oracle口令加密算法(2)
  10. d盘信号灯超时时间已到_20下教师资格证笔试成绩什么时候公布?今年面试是什么时候?这些时间节点抢先了解!...
  11. 泛微协同商务系统办公自动化解决方案
  12. 期末考试之排名次java_2020超星尔雅《JavaWeb应用开发》期末测试答案
  13. java当前时间增加一小时怎么写
  14. coreldraw怎么扣圆形_coreldraw如何抠图?coreldraw抠图图文教程
  15. 路由器怎么设置WiFi短信认证?
  16. php sftp上传图片,SFTP远道文件上传
  17. 【Spark】SparkStreaming-流处理-规则动态更新-解决方案
  18. 交通灯 单片机课程设计
  19. 记某XXB系统一次性能优化
  20. 计算机控制电梯如需改变功能 则,电梯维修项目教程 教学课件 作者 孙文涛附加答案试卷综合实训三模拟试题(13).doc...

热门文章

  1. 全自动pdf转word转换器独家发布
  2. JavaScript开发简易音乐播放器
  3. android-基础知识解析
  4. php中的四舍五入,php中四舍五入取整函数详细介绍
  5. 4399枪神传说服务器维护,枪神传说6月14日更新维护公告 战队系统上线
  6. Requests中文版本发布
  7. Linux通讯架构服务器开发学习笔记
  8. apex服务器不稳定,APEX英雄提高帧数稳定144修改方法
  9. MVC模式和三层架构
  10. C# 使用FileSystemWatcher类来对一个日志文件的变化进行实时监测