broken necklace
你有一條由n個紅色的,白色的,或藍色的珠子組成的項鍊(3<=n<=350),珠子是隨意安排的。 這裡是 n=29 的二個例子:
第一和第二個珠子在中已經被作記號。
brbrrrbbbrrrrrbrrbbrbbbbrrrrb .
假如你要在一些點打破項鍊,展開成一條直線,然後從一端開始收集同顏色的珠子直到你遇到乙個不同的顏色珠子,在另一端做同樣的事。(顏色可能與在這之前收集的不同) 確定應該在**打破項鍊來收集到最大多數的數目的子。 example 舉例來說,在 a 中的項鍊,可以收集到8個珠子,在珠子 9 和珠子 10 或珠子 24 和珠子 25 之間打斷項鍊。 在一些項鍊中,包括白色的珠子如 b 所示。 當收集珠子的時候,乙個被遇到的白色珠子可以被當做紅色也可以被當做藍色。 表現項鍊的字串將會包括三符號 r , b 和 w 。 寫乙個程式來確定從一條被**的項鍊最大可以被收集珠子數目。
sample input
29
wwwbbrwrbrbrrbrbrwrwwrbwrwrrb
output format
單獨的一行包含從被**的項鍊可以被收集的珠子數目的最大值。
sample output
11
解題目分析如下:
如果採用反覆搜尋的演算法也是可以,只是效率要低,使用動態規劃記錄已經計算過的值避免重複計算
以下標i分開將環形即展開為一條直線為
i-1...n...i
可以這樣想,用red[i]和blue[i],對於第i個一珠子兩種顏色的數目,從左至右進行收集,對於第i個珠子,如果我們知道從i=0開始到第i-1的珠子時能收集的相應顏色個數,那麼對第個珠子來說就可能出現如下幾種情況
1.如果i是紅色,那麼red[i] = red[i-1]+1,blue[i] = 0;
2.如果i是綠色,那麼blue[i] = blue[i]+1,red[i] = 0;
3.如果i是白色,那麼red[i] = rad[i-1]+1 並且 blue[i] = blue[i-1]+1;
類似從右至左也是一樣,即[i] 與 [i+1]之間的關係
舉乙個簡單的例子:123456將其從任意點斷開的形式有,用i表示下標從0..n-1
123456 從0處斷開,這時應該掃瞄兩端從左至右和從右至左收集滿足條件的
234561 從1處斷開
345612 ...2..
456123 ...3..
561234 ....4...
612345 ....5...
從上面可以看出對n個元素的項鍊有n種不同的分折法
對於從左至右時可以將原陣列修改為123456123456
通過上述分析則得出對於任意分折點i,有left[i],right[i]的珠子個數,這樣求最大的和 max(toleft[i]+toright[i]) 即為要求的解
因為有紅和綠之分,分別求出toleft[i]中紅與綠的最大值max(toleft[i][0],toleft[i][1]),toleft[i][0]表示綠,toleft[i][1]表示紅...
toright類似
#include
<
stdio.h
>
#include
<
string
.h>
intgetmax(
inta,
intb)
intmain()
else
if(tmp[i-1
] =='r
')else
if(tmp[i-1
] =='w
')}for
(i =n*
2-1; i
>=0;
--i)
else
if(tmp[i] =='
r')else
if(tmp[i] =='
w')}
max =0
;int
l,r;
for(i =0
; i
2; ++i)
if(max
>
n) max =n;
printf(
"%d
",max);
return0;
}
動態規劃演算法
一 動態規劃演算法原理 將待求解的問題分解成若干個相互聯絡的子問題,先求解子問題,然後從這些子問題的解得到原問題的解 對於重複出現的子問題,只在第一次遇到的時候對它進行求解,並把答案儲存起來。了不去求解相同的子問題,引入乙個陣列,把所有子問題的解存於該陣列中,這就是動態規劃所採用的基本方法。動態規劃...
動態規劃演算法
動態規劃 通過把原問題分解為相對簡單的子問題來求解複雜問題。動態規劃常常適用於有重疊子問題和最優子結構性質的問題。演算法總體思想 演算法的基本步驟 演算法的基本要素 最優子結構 重疊子問題 備忘錄方法 問題描述 子串行 公共子串行 最長公共子串行 lcs 問題 問題分析 動態規劃求解lcs問題 最長...
動態規劃演算法
動態規劃演算法的思路 動態規劃法即 dynamic programming method dp 是系統分析中的種常用方法。動態規劃法是20世紀50年代由貝爾曼 r.bellman 等人提出的,用來解決多階段決策過程問題的一種最優化方法。多階段決策過程是指把研究問題分成若干個相互聯絡的階段,由每個階段...