我们有多个N位数(它可以从0开始)。我们必须找到可以获得的最大数量来切割长度为L的K个不相交序列。 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个序列,这些序列在初始数字中不是不相交的,所以我的方法不正确。请帮我解决问题!
答案 0 :(得分:0)
您可以递归地定义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