[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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章