AmoebaCode

给定一个由数字字符构成的字符串,以及一个数值K,保证字符串中所有数字都小于等于K,题目问如果将所有的0用1~K之间的数字替换,设替换所得结果串中任意两个相同字符间的最小间隔为D,求D的最大值。

 

举例:“1001”,K=2,则可能的替换串为“1111”、“1211”、“1221”、“1121”,所以D最大值为1(连续的相同字符的间隔为1)。

 

分析发现D最大不会超过K,按照最佳选择,前K个数字一定是1~K,在第K+1位,如果选1之外的其他数值,将导致D<K,所以只有选1才能保住D=K的可能性,依次类推,理想的排列应该是1~K...1~K...1~K,其所能达到的最佳D值为K。

 

有了K作为上限,继续想象以K长度后缀串作为位置“标记”,从起始字符开始,可能经过不同的组合,到达第i位时有一个标记为Si,所经过的任意相同字符间最短距离为Di,然后由Si再继续前进一位至第i+1位,如果i+1位为0,则Si+1位可由Si的后K-1位加上1~K字符构成(K中情况),如果i+1位非0,则Si+1位可由Si的后K-1位加上i+1位的字符构成(1种情况),然后Di+1=min{Di, miniDistance(Si+1)},miniDistance函数检查标记串Si+1内的相同字符最短距离,两者取其小,得到Si+1标记在i+1位置的最短距离Di+1。但是,由于相同的Si+1可能通过不同的前序组合到达i+1位,所以,多条路径下应该取各各Di+1间的大者来最终表示Si+1在i+1位置的最大距离。依据这个原理,从第1位递推前进至第n位,取第n位上所有标记对应的Dn的最大值,即为解。

 

 

以上解是一个可行方法,但是通过实际测试,发现对于一些测试用例,程序会超时,比如K=7,字符串为“00000000000000000000000000000000000010000000000000”,分析下来,原因是因为前面很多的0导致了每个位置都有非常多的可能“标签”,推进速度非常慢。

 

需要寻找改进的方法,题目要找最大的D值,如果预先设定最小间距dist,然后检查这个dist下,如果由可行的替换字符串,则dist有效。依照这个思路,可以将dist从K往1一步一步尝试,一旦发现能够得到有效的替换字符串,则D就为当前的dist值。循着这个思路,再接着想,设第i位有个标记Si,如果第i+1位为0,则标记Si+1可能为Si后dist-1位加上不重复的一个候选字符(不重复意为与Si的后dist-1位中的字符无重复,否则不符合dist的意义);如果第i+1位非0,只有当Si后dist-1位不含该非0字符时才能得到Si+1,否则不能推进。如果某个dist下,能够推进到字符串最后一位,则表示保持该dist为相同字符间最小间隔时,能够替换得到可行解,则dist就是解。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值