【发布时间】: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个初始编号不相交的序列,所以我的方法是不正确的。请帮我解决问题!
【问题讨论】:
-
222122122212222 个长度为 3 的序列怎么样?93 个长度为 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。您可以通过动态规划有效地求解这些方程。