Codechef解决方案动态规划

标签 c algorithm dynamic-programming breadth-first-search

这是 code-chef 六月挑战问题(比赛已结束)

厨师喜欢游戏!但他喜欢发明自己的东西。现在他玩游戏“数字跳跃”。 Chef 具有数字序列 S1、S2、...、SN、。他停留在第一位数字(S1),并希望以最少的跳跃次数到达最后一位数字(SN)。 当停留在索引为 i(数字 Si)的某个数字 x 时,Chef 可以跳转到索引为 i - 1 (Si-1) 和 i + 1 (Si+1) 的数字,但他不能跳出顺序。或者他可以跳转到任何具有相同值 x 的数字。 帮助 Chef 找到从数字 S1 到达数字 SN 所需的最少跳跃次数。

输入

输入包含一行,由长度为 N 的字符串 S(数字序列)组成。

输出

在单行中打印单个整数 - 他需要的最小跳转次数。

约束

1 ≤ N ≤ 10^5 S的每个符号都是0到9的数字。

示例

输入: 01234567890

输出: 1

输入: 012134444444443

输出: 4

这是他提供的解决方案之一

设 dp[i] 表示从位置 0 到位置 i 所需的步数。 根据之前的观察,我们知道不需要超过 20 个步骤。 所以让我们进行 20 次迭代。

在开始所有迭代之前,我们将为所有其他 i > 1 设置 dp[1] = 0 和 dp[i] = 无穷大。 在每次迭代中,我们将计算 Q[k],其中 Q[k] 是 dp[i] 的最小值,使得 s[i] = k。 IE。 Q[k]表示该数字等于k的位置上dp的最小值。

我们可以通过以下方法更新dp。 dp[i] = min(dp[i], dp[i - 1] + 1, dp[i + 1] + 1, Q[s[i]] + 1);

这里术语 dp[i - 1] + 1 表示我们来自先前的位置,即 (i - 1)。 这里术语 dp[i + 1] + 1 表示我们来自下一个位置,即 (i + 1)。 Q[s[i]] + 1 表示从与当前第 i 位数字相同的位置开始所需的最少运算次数。

您可以在此处查看问题和社论

http://discuss.codechef.com/questions/44800/digjump-editorial?sort=votes&page=2

我不明白为什么他认为20次迭代就足够了。我理解我们最多需要20次跳转才能达到任何数字,但这与迭代次数有什么关系。事实上,有一些用户评论他们只迭代了三次(前进、后退和再次前进),而一些用户迭代了 10 次并获得了他们的解决方案被接受。在 bfs 解决方案中,图表看起来到底如何。任何人都可以用一个小例子解释一下。

最佳答案

我已经通过简单的 BFS 和一次修改解决了这个问题。一旦您第一次到达距离 d 的数字 D,您就可以将到其他具有数字 D 的位置的距离更新为 d+1.

关于Codechef解决方案动态规划,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24328640/

相关文章:

c - 通过数组在 C 中排队

c - 链接 sqlite C 时出错

algorithm - 用于查找缺少字母的单词的良好算法和数据结构?

algorithm - 递归树算法的运行时复杂度是多少,它在不同子树大小的数量上是二次的?

java - 嵌套框算法 - 基于嵌套娃娃但根本不同?

java - 动态规划 - 图论

c++ - 这段代码是如何工作的,它叫什么

c - 如何通过偏移获取/设置结构成员

javascript - 如何随机化此 2D 像素扩散函数以模拟火势蔓延?

algorithm - 需要有关信用到期算法的帮助