动态规划肯定能解这个问题。不过直觉告诉我,这个问题可能能用贪心算法。关于这个目前我没有完全证明,只是直觉
关于这个问题,我的第一反应是如何绕开大数运算。因为它本身就是个编码复杂、效率低下的算法。基础方法的效率是O(n^2),而目前我知道的最有效的方法也需要O(n^1.6),且代码要复杂很多。
设串为A,长度为N。那么这个串的数值可以表示为
0.A * 10^N (举个例子,对于串123,其数值可以表示为0.123 * 10^3)
如果将A从第i位与第i+1位之间分开成两部分B、C。那么这两部分的乘积可表示为
0.B * 10^i * 0.C * 10^(N-i)
= 0.B * 0.C * 10^N
由此可见,影响B、C的乘积大小的因素是0.B和0.C的大小,而不是它们的长短。
而0.B、0.C的大小比较是等同于字符串的比较的。也就是说,靠近左侧的数字越大这个小数的值就越大。
所以我们可以先找出串中所有最大数字(一位)出现的位置(不包括串的首位)及数量(设为T)。
如果T = K,那么就直接在这些位置的前面插入乘号即完成任务。
如果T < K,那么可以肯定的是这些位置前面是必须要插入乘号的,之后在找出串中次大的数字出现的位置及数量,重复上述过程。
如果T > K,那么需要将这T个串合并成K个。如何合并?这是我还没有想清楚的部分。
将最小的串与前一串合并?如果有多个相等的最小串又该如何合并?等等等等
呵呵,如果能找到一个合并最优合并策略,并要达到局部最优等价于整体最优的程度,那以这个问题就可以应用贪心算法了。
如果找不到,我想也应该在这部分应用动态规划来解决这个子问题。一来问题规模被缩小了,二来运算手段简单了。
希望我这块砖能敲开各位思想的大门,引出美玉来