[USACO] Broken Necklace

充满杯具的一道题,提交了5次才AC。。。

最简单的方法是步长为1的遍历整个项链,在断开处向两个方向搜索,然后求和的最大值(分析的解法一),但是效率不高。

如果我们找局部最长的满足要求的子串,则子串内部不再需要遍历,比如“rrrbb”,两个r之间是不需要隔断的,这样步长变大了,不过遇到brbrbr这样的情况也无能为力。。。

根据例子的提示,把字符串首尾相连构造一个2倍长的数组,就不需要考虑取模的问题了。

最外层循环i<n-1是因为i=n-1是表示在最末端断开,所以无须再进入循环了。


 

 


 

分析的解法一:定义break的位置和方向,从1到n进行遍历,找最大值。但是注意类似“rrr”这种情况会导致两个方向重复计算,要特殊处理。

分析的解法二:DP,唉!没想到啊,O(n)的复杂度。解法声明了两个800*2,一个800,一个400(这个可以省下的)的字符数组,明显的空间换时间。

分析的解法三:与解法一类似,但是是单向遍历找到每个开始字符可以构造的最长的序列,此序列是断开处两个字符串的整体,比如“rrrbbrr”,第一次遍历起始点为r,得到长度为5,断点在rrr和bb之间。

 


 

整体来说,此题没有想到DP很是失败,我的方法不好理解,想的条件还多,易错,调试麻烦,没有解法一的易懂以及解法二的简洁,解法三比较有新意。在分析题的过程中有些浮躁和草率,没有集中精神,比如右边子串与左边子串的重叠问题,当右边子串变成左边吸收原来的左边子串邻接的w问题等等,这导致在最后编码时很多边界条件和特殊情况没有考虑到,wa多次!

心平气和,再接再厉!!

最后一点:把心里想的用文字写出来真是一件不太容易的事情。。。:P

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值