Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2021-08-08:自由之路。电子游戏“辐射4”中,任务“通向自

2021-08-08:自由之路。电子游戏“辐射4”中,任务“通向自

原创
作者头像
福大大架构师每日一题
修改于 2021-08-09 03:26:10
修改于 2021-08-09 03:26:10
3600
举报

2021-08-08:自由之路。电子游戏“辐射4”中,任务“通向自由”要求玩家到达名为“Freedom Trail Ring”的金属表盘,并使用表盘拼写特定关键词才能开门。给定一个字符串 ring,表示刻在外环上的编码;给定另一个字符串 key,表示需要拼写的关键词。您需要算出能够拼写关键词中所有字符的最少步数。最初,ring 的第一个字符与12:00方向对齐。您需要顺时针或逆时针旋转 ring 以使 key 的一个字符在 12:00 方向对齐,然后按下中心按钮,以此逐个拼写完 key 中的所有字符。旋转 ring 拼出 key 字符 keyi 的阶段中:您可以将 ring 顺时针或逆时针旋转一个位置,计为1步。旋转的最终目的是将字符串 ring 的一个字符与 12:00 方向对齐,并且这个字符必须等于字符 keyi 。如果字符 keyi 已经对齐到12:00方向,您需要按下中心按钮进行拼写,这也将算作 1 步。按完之后,您可以开始拼写 key 的下一个字符(下一阶段), 直至完成所有拼写。

在这里插入图片描述
在这里插入图片描述

福大大 答案2021-08-08:

递归。具体见代码。

代码用golang编写。代码如下:

代码语言:txt
AI代码解释
复制
package main

import (
    "fmt"
    "math"
)

func main() {
    ring := "godding"
    key := "gd"
    ret := findRotateSteps(ring, key)
    fmt.Println(ret)
}

func findRotateSteps(r string, k string) int {
    N := len(r)
    map0 := make(map[byte][]int)
    for i := 0; i < N; i++ {
        if _, ok := map0[r[i]]; !ok {
            map0[r[i]] = make([]int, 0)
        }
        map0[r[i]] = append(map0[r[i]], i)
    }
    M := len(k)
    dp := make([][]int, N)
    for i := 0; i < N; i++ {
        dp[i] = make([]int, M+1)
    }
    for i := 0; i < N; i++ {
        for j := 0; j <= M; j++ {
            dp[i][j] = -1
        }
    }
    return process(0, 0, k, map0, N, dp)
}

// 电话里:指针指着的上一个按键preButton
// 目标里:此时要搞定哪个字符?keyIndex
// map : key 一种字符 value: 哪些位置拥有这个字符
// N: 电话大小
// f(0, 0, aim, map, N)
func process(preButton int, index int, str string, map0 map[byte][]int, N int, dp [][]int) int {
    if dp[preButton][index] != -1 {
        return dp[preButton][index]
    }
    ans := math.MaxInt64
    if index == len(str) {
        ans = 0
    } else {
        // 还有字符需要搞定呢!
        cur := str[index]
        nextPositions := map0[cur]
        for _, next := range nextPositions {
            cost := dial(preButton, next, N) + 1 + process(next, index+1, str, map0, N, dp)
            ans = getMin(ans, cost)
        }
    }
    dp[preButton][index] = ans
    return ans
}

func dial(i1 int, i2 int, size int) int {
    return getMin(Abs(i1-i2), getMin(i1, i2)+size-getMax(i1, i2))
}

func getMin(a int, b int) int {
    if a < b {
        return a
    } else {
        return b
    }
}

func Abs(a int) int {
    if a < 0 {
        return -a
    } else {
        return a
    }
}

func getMax(a int, b int) int {
    if a > b {
        return a
    } else {
        return b
    }
}

执行结果如下:

在这里插入图片描述
在这里插入图片描述

左神java代码

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
自由之路
视频游戏“辐射4”中,任务“通向自由”要求玩家到达名为“Freedom Trail Ring”的金属表盘,并使用表盘拼写特定关键词才能开门。
你的益达
2020/11/12
7920
【一天一大 lee】自由之路 (难度:困难) - Day20201111
视频游戏“辐射4”中,任务“通向自由”要求玩家到达名为“Freedom Trail Ring”的金属表盘,并使用表盘拼写特定关键词才能开门。
前端小书童
2020/11/19
3510
【一天一大 lee】自由之路 (难度:困难) - Day20201111
​LeetCode刷题实战514:自由之路
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2022/03/03
2210
​LeetCode刷题实战514:自由之路
LeetCode 514. 自由之路(记忆化递归 / DP)
电子游戏“辐射4”中,任务“通向自由”要求玩家到达名为“Freedom Trail Ring”的金属表盘,并使用表盘拼写特定关键词才能开门。
Michael阿明
2021/02/19
3350
LeetCode 514. 自由之路(记忆化递归 / DP)
2021-09-08:每一个项目都有三个数,[a,b,c]表示这个项目a
2021-09-08:每一个项目都有三个数,a,b,c表示这个项目a和b乐队参演,花费为c。每一个乐队可能在多个项目里都出现了,但是只能被挑一次。nums是可以挑选的项目数量,所以一定会有nums2只乐队被挑选出来。返回一共挑nums轮(也就意味着一定请到所有的乐队),最少花费是多少。如果怎么都无法在nums轮请到nums2只乐队且每只乐队只能被挑一次,返回-1。nums<9,programs长度小于500,每组测试乐队的全部数量一定是nums2,且标号一定是0 ~ nums2-1。
福大大架构师每日一题
2021/09/08
2580
练琴时悟出的动态规划算法,帮我通关了《辐射4》
这个可以转动的圆盘类似是一个密码机关,中间偏上的位置有个红色的指针看到没,你只要转动圆盘可以让指针指向不同的字母,然后再按下中间的按钮就可以输入指针指向的字母。
labuladong
2021/09/23
5890
2021-06-24:求一个字符串中,最长无重复字符子串长度。
2021-06-24:求一个字符串中,最长无重复字符子串长度。 福大大 答案2021-06-24: 方法一:滑动窗口。自然智慧。 不重复的时候,右指针右移;重复的时候,左指针右移。 方法二:求出最右不重复位置。 map:key是值,value是数组序号,初始值value都是-1。 时间复杂度:O(N)。空间复杂度:O(不同字符个数)。 代码用golang编写。代码如下: package main import "fmt" func main() { s := "moonfdd" ret1 := le
福大大架构师每日一题
2021/06/25
2730
2021-06-24:求一个字符串中,最长无重复字符子串长度。
2021-08-30:给定两个字符串str1和str2,在str1中寻找一个
2021-08-30:给定两个字符串str1和str2,在str1中寻找一个最短子串,能包含str2的所有字符,字符顺序无所谓,str1的这个最短子串也可以包含多余的字符。返回这个最短包含子串。
福大大架构师每日一题
2021/08/30
9410
2021-08-30:给定两个字符串str1和str2,在str1中寻找一个
2021-04-27:如果一个字符相邻的位置没有相同字符
2021-04-27:如果一个字符相邻的位置没有相同字符,那么这个位置的字符出现不能被消掉。比如:"ab",其中a和b都不能被消掉 。如果一个字符相邻的位置有相同字符,就可以一起消掉。比如:“abbbc”,中间一串的b是可以被消掉的, 消除之后剩下“ac”。某些字符如果消掉了,剩下的字符认为重新靠在一起。给定一个字符串,你可以决定每一步消除的顺序,目标是请尽可能多的消掉字符,返回最少的剩余字符数量。比如:"aacca", 如果先消掉最左侧的"aa",那么将剩下"cca",然后把"cc"消掉,剩下的"a"将无法再消除,返回1。但是如果先消掉中间的"cc",那么将剩下"aaa",最后都消掉就一个字符也不剩了,返回0,这才是最优解。 再比如:"baaccabb",如果先消除最左侧的两个a,剩下"bccabb",如果再消除最左侧的两个c,剩下"babb", 最后消除最右侧的两个b,剩下"ba"无法再消除,返回2。而最优策略是:先消除中间的两个c,剩下"baaabb",再消除中间的三个a,剩下"bbb",最后消除三个b, 不留下任何字符,返回0,这才是最优解。
福大大架构师每日一题
2021/05/04
4810
2021-04-27:如果一个字符相邻的位置没有相同字符
2021-06-08:一个字符串至少要切几刀能让切出来的子串都是回文串?
方法二、对字符串范围做是否是回文串的dp。dpi=true是i,j范围上是回文串,dpi依赖左下方。消耗O(N**2)的空间。
福大大架构师每日一题
2021/06/08
2220
2021-06-08:一个字符串至少要切几刀能让切出来的子串都是回文串?
2021-08-31:去除重复字母。给你一个字符串 s ,请你去除
2021-08-31:去除重复字母。给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。力扣316。
福大大架构师每日一题
2021/08/31
9830
2021-08-31:去除重复字母。给你一个字符串 s ,请你去除
2021-07-30:两个有序数组间相加和的Topk问题。给定两个
2021-07-30:两个有序数组间相加和的Topk问题。给定两个有序数组arr1和arr2,再给定一个整数k,返回来自arr1和arr2的两个数相加和最大的前k个,两个数必须分别来自两个数组。按照降序输出。要求时间复杂度为O(klogk)。
福大大架构师每日一题
2021/07/31
3390
2021-07-30:两个有序数组间相加和的Topk问题。给定两个
2021-02-18:给定一个字符串str,给定一个字符串类
2021-02-18:给定一个字符串str,给定一个字符串类型的数组arr,出现的字符都是小写英文。arr每一个字符串,代表一张贴纸,你可以把单个字符剪开使用,目的是拼出str来。返回需要至少多少张贴纸可以完成这个任务。例子:str= "babac",arr = {"ba","c","abcd"}。a + ba + c 3 abcd + abcd 2 abcd+ba 2。所以返回2。
福大大架构师每日一题
2021/02/18
4980
2021-02-18:给定一个字符串str,给定一个字符串类
2022-01-26:最优账单平衡。 一群朋友在度假期间会相互借
一群朋友在度假期间会相互借钱。比如说,小爱同学支付了小新同学的午餐共计 10 美元。如果小明同学支付了小爱同学的出租车钱共计 5 美元。我们可以用一个三元组 (x, y, z) 表示一次交易,表示 x 借给 y 共计 z 美元。用 0, 1, 2 表示小爱同学、小新同学和小明同学(0, 1, 2 为人的标号),上述交易可以表示为 [0, 1, 10, 2, 0, 5]。
福大大架构师每日一题
2022/01/26
1790
2021-12-22:回文子串。 给你一个字符串 s ,请你统计并返
解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"。
福大大架构师每日一题
2021/12/22
2140
2021-08-15:给定一个字符串Str,返回Str的所有子序列中
2021-08-15:给定一个字符串Str,返回Str的所有子序列中有多少不同的字面值。
福大大架构师每日一题
2021/08/15
8720
2021-08-15:给定一个字符串Str,返回Str的所有子序列中
2021-10-11:二叉树中的最大路径和。路径 被定义为一条从
2021-10-11:二叉树中的最大路径和。路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。路径和 是路径中各节点值的总和。给你一个二叉树的根节点 root ,返回其 最大路径和 。力扣124。
福大大架构师每日一题
2021/10/11
6680
2021-05-17:数组中所有数都异或起来的结果,叫做异或和
2021-05-17:数组中所有数都异或起来的结果,叫做异或和。给定一个数组arr,可以任意切分成若干个不相交的子数组。其中一定存在一种最优方案,使得切出异或和为0的子数组最多。返回这个最多数量。
福大大架构师每日一题
2021/05/17
4940
2021-05-17:数组中所有数都异或起来的结果,叫做异或和
2021-06-11:给定两个字符串s1和s2,问s2最少删除多少字符可以成为s1的子串?
2021-06-11:给定两个字符串s1和s2,问s2最少删除多少字符可以成为s1的子串? 比如 s1 = "abcde",s2 = "axbc"。
福大大架构师每日一题
2021/06/11
3570
2021-06-11:给定两个字符串s1和s2,问s2最少删除多少字符可以成为s1的子串?
2021-08-15:给定一个字符串Str,返回Str的所有子序列中有多少不同的字面值。
2021-08-15:给定一个字符串Str,返回Str的所有子序列中有多少不同的字面值。
福大大架构师每日一题
2021/09/03
4830
2021-08-15:给定一个字符串Str,返回Str的所有子序列中有多少不同的字面值。
推荐阅读
相关推荐
自由之路
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档