切割长度为L的K序列以获得最大数量

时间:2017-09-09 09:26:28

标签: string algorithm numbers

我们有多个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个序列,这些序列在初始数字中不是不相交的,所以我的方法不正确。请帮我解决问题!

1 个答案:

答案 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