【问题标题】:Cut K sequences of length L to obtain the biggest number截取长度为 L 的 K 个序列,得到最大数
【发布时间】:2017-09-09 09:26:27
【问题描述】:

我们有 N 个数字(可以从 0 开始)。我们必须找到切割 K 个长度为 L 的不相交序列可以获得的最大数。 N 可以很大,所以我们的数字应该存储为字符串。

示例 1)

nr = 12122212212212121222
K = 2, L = 3
answer: 22212212221222
We can cut "121" (from 0th digit) and "121" (from 12th digit).

示例 2)

nr = 0739276145
K = 3, L = 3
answer: 9
We can cut "073", "276" and "145".

我尝试过这样的事情:

void cut(string str, int K, int L) {
    if (K == 0)
        return;

    // here we cut a single sequence of length L
    // in a way that the new number is the biggest

    cut(str, K - 1, L);
}

但是通过这种方式,我可以剪切2个初始编号不相交的序列,所以我的方法是不正确的。请帮我解决问题!

【问题讨论】:

  • 22212212221222 2 个长度为 3 的序列怎么样? 9 3 个长度为 3 的序列怎么样?问题很不清楚,您尝试的代码也无济于事——结果是如何计算和返回的?
  • 我认为很清楚,您必须从初始数字中切割出长度为 L 的 K 序列才能获得另一个数字(并且这个数字必须是最大值)。我已经更新了示例。给出了初始数字 K 和 L,您必须找到切割后获得的数字。
  • 我现在明白了——你是在删除部分而不是拿走它们。这个问题似乎有一个简单的递归定义最佳解决方案:cut(s, K, L) = max(s[:i] + cut(s[i+L:], K-1, L) for i = 0... len(S)-K*L) 与基本情况cut(s, 0, L) = s。您可以通过动态规划有效地求解这些方程。

标签: string algorithm numbers


【解决方案1】:

你可以递归定义cuts

cuts(s, 0, L) = s
cuts(s, K, L) = max(s[i:j] + cuts(s[j+L:], K-1, L) for j=i..len(s)-K*L)

在这些问题中很正常,您可以使用动态编程来避免指数运行时间。您可能可以避免如此多的字符串切片和附加,但这是 Python 中的一个示例解决方案:

def cuts(s, K, L):
    dp = [s[i:] for i in xrange(len(s)+1)]
    for k in xrange(1, K+1):
        dp = [max(s[i:j] + dp[j+L] for j in xrange(i, len(dp)-L))
              for i in xrange(len(dp)-L)]
    return dp[0]

print cuts('12122212212212121222', 2, 3)
print cuts('0739276145', 3, 3)

输出:

22212212221222
9

【讨论】:

    猜你喜欢
    • 2021-11-14
    • 2011-12-13
    • 2019-08-22
    • 1970-01-01
    • 2021-02-18
    • 2011-06-27
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    相关资源
    最近更新 更多