来自本人百度空间 2009-11-13 08:03
我觉得是该写点什么了…………
昨天VJ连续第N天挂掉…………
没办法,就去做USACO
我们就继续USACO之旅
今天做了恶心的那道项链题(1.4)
话说,这题DP没什么问题,应该大家都能搞定,我今天就来说说我突然脑子冲血做的方法……
这种方法做得我很憔悴……
好,先来大体介绍介绍我的方法……下面是我的测试时间
Executing...
Test 1: TEST OK [0.000 secs, 208 KB]
Test 2: TEST OK [0.011 secs, 208 KB]
Test 3: TEST OK [0.000 secs, 208 KB]
Test 4: TEST OK [0.011 secs, 208 KB]
Test 5: TEST OK [0.000 secs, 208 KB]
Test 6: TEST OK [0.000 secs, 208 KB]
Test 7: TEST OK [0.000 secs, 208 KB]
Test 8: TEST OK [0.000 secs, 208 KB]
Test 9: TEST OK [0.000 secs, 208 KB]
All tests OK.
2和4都用了较多时间,因为我这个方法,和‘w’非常有关系,下面大家就会知道。
首先,我的算法,可以号称o(n)(最近是比较流行的词……),其实会多一些,因为我们扫描的时候要考虑所扫描段前后的‘w’。好啦,不卖关子了,介绍算法。
我们用两个sum来记录当前扫描的和的值,以及前一个扫描的和的值。
我们先来解决容易的,如果扫描指针i在项链中间的时候,当它所对的珠子前是‘w’的时候,减小指针,并减小前一个和。之后,当后面的珠子和当前珠子能连接,且后面珠子没有超出项链范围时,增加指针,并增加当前和。这部扫描之后你就可以得到两个和,将这两个和的和与max比较。
当然还有两头的问题,当你加到最后的和的时候,首先要考虑的是,尾的和+首的和与max比较。显然我们需要记录首和。其次,首位如果能连起来的话,又需要考虑将首和加到最后的两个sum的和中,我在程序中就没有考虑将尾和加入前两个sum的和中,USACO并没有设置这样的数据……当然,在读入之后的预处理,可以解决头尾的颜色(头尾都可能出现‘w’,所以不能随意地取头尾的珠子为头尾颜色)。
当然,这个算法虽然说比DP省时,但的确很难想的周全,下面我就说我自己注意到的特殊情况,虽然过了USACO的关,但不一定是完全正确啊,也还希望大家帮我挑挑骨头。
首先,你要避免整个项链可以全部取完,即除了‘w’全部同色。这样的恶心数据就让我挂了一次,
3
rrr
我的答案是6……
阿门,终于过了这个恶心题…………
USACO,继续进发~!~~!