使用動態規劃演算法解決Broken Necklace

2021-04-17 17:50:30 字數 2306 閱讀 9276

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 等人提出的,用來解決多階段決策過程問題的一種最優化方法。多階段決策過程是指把研究問題分成若干個相互聯絡的階段,由每個階段...