【问题标题】:Dynamic programming approach or a case that fails the greedy动态规划方法或贪婪失败的案例
【发布时间】:2012-06-08 18:37:47
【问题描述】:

我有一个长度为1 <= |S| <= 100K (1 <= K <= 10) 的字符串

此字符串包含digits < K 和问号。我想用digits < K 替换这些问号,没有两个相邻的数字相等。字符串是圆形的,所以不能是这样的:1?111?

生成的字符串必须是按字典顺序最小的字符串。

输入输出示例

input:
K = 4
string = ?????

output:
01012

我尝试了一种贪婪的方法,但对于一些未知的测试用例它失败了。我认为它需要一种 dp 方法但无法弄清楚状态,并且纯递归代码无法及时适应。

对 dp 方法有什么帮助,或者对贪婪失败的棘手测试用例有什么帮助吗?

谢谢,

【问题讨论】:

  • 如果你不知道它失败的测试用例,你怎么知道它失败了?
  • 不会生成一个“不满足贪心”的测试用例需要知道正在使用哪种贪心算法吗?
  • @ScottHunter 它在提交在线法官时给出了错误的答案,我已经有效地实施了我的贪婪解决方案,所以我确信它需要一个 dp 方法
  • 我的贪婪方法是从左到右迭代,并在每个问号索引处放置最小有效k
  • K = 2, ???0?? 使贪婪方法失败。尝试了解原因。

标签: algorithm dynamic-programming greedy


【解决方案1】:

如果字符串的一端有一个数字,贪心算法会给你正确的答案。

如果您的字符串以问号开头和结尾,则第一个字符(0 或 1)有 2 种可能,在这两种情况下运行贪心算法并取最佳值。

力考指出的错误答案:

贪婪有效,但你必须从紧跟在已知数字后面的第一个问号开始。

【讨论】:

  • 嗯,不完全是。我认为要最小化它,需要在已知数字前面(而不是后面)取第一个问号。但原理是一样的。
  • 完全正确。贪婪会做这项工作,但你必须“旋转”你的字符串,以便从固定的边界条件开始
【解决方案2】:

它的简单回溯 imo。为什么要用贪婪或动态来复杂化它。

【讨论】:

  • 不,肯定会及时失败。最坏情况下的字符串长度为 100,全是 '?'
猜你喜欢
  • 2013-05-17
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2016-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多