給定一串由三種珠子構成的項鍊,珠子的種類分為紅色的r,藍色的b,白色的w;
項鍊是個圈,按順序由一串字元表示,如:
r b b r 1
r b 2
r r
r r
b r
位置3--> <--位置2
w b
b b
b b
<--位置1
r r
b r
b r
r r
r b r
用字串rbrrrbbbrrrrrbrrbbrbbwbrrrrbb表示。
在項鍊上挑乙個位置剪開,從剪開位置向兩端收集連續的且同色的珠子,收集到的珠子總數記為n,求n的最大值。
如圖,在位置1剪開,向兩端分別收集到5個紅珠子與3個藍珠子,n1=8;在位置2剪開,向兩端分別收集到3個紅珠子與三個藍珠子,n2為6;在位置3剪開,向兩端分別收集到3個藍珠子和1個藍珠子。
如果遇到白珠子,則白珠子可以當作紅珠子,也可以當作藍珠子。
輸入格式:line 1:n(表示一串項鍊上的珠子總數)
line 2:n個字元的字串(表示這一串珠子)
輸出格式one line:nmax(表述取得的最大珠子數)
樣例輸入29
rbrrrbbbrrrrrbrrbbrbbwbrrrrbb
(如上圖)
樣例輸出8
從結果來看,收集珠子數最大的剪開位置某一端收集到的珠子只可能是紅珠子或者藍珠子(每乙個剪開位置都是如此)。同時,最大收集珠子數一定等於左端可收集的最大珠子數加上右端可收集的最大珠子數。
依據上述前提提出如下演算法:任取乙個剪開點,假設先從左端開始收集(從右端先開始效果對稱),則有兩種情況,收集最大可能的紅色珠子(情況1)或收集最大可能的藍色珠子(情況2)(當收集紅色珠子時,白色珠子當作紅色珠子;同樣,當收集藍色珠子時,白色珠子當作藍色珠子)。
在上述兩種情況的基礎上,又分別有兩種情況:右端收集紅色珠子(情況11和情況21),右端收集藍色珠子(情況12和情況22)。
求得四種情況下的左端收集數與右端收集數之和,取最大的和作為該剪開點下的收集數n。
遍歷所有剪開點,求出所有剪開點下的收集數n,取最大的,即為nmax。
需要注意的是:右端取珠子是在左端取珠子的基礎上取的,所以右端取珠子需要避免重複取左端已經取過的珠子!
同時,由於項鍊為環形,可以考慮用陣列讀入之後,在原陣列後貼上上同樣的乙個陣列,這樣便可以實現在環形條件下取珠子。
#includeint max(int a,int b)
int min(int a,int b)
int main()
else
break;
}j=i+1;
while(j=max(0,i-num+1))
else
break;
}j=i+1;
while(jelse
break;
}j=i+1;
while(jelse
break;
}len[i]=max(lb,lr)+max(rb,rr);
}maxr=len[0];
for(i=0;imaxm=max(maxb,maxr);
fprintf(fout,"%d\n",maxm);
return 0;
}
2006 10 12個人感悟
1。要真正掌握計算機系統,需要對計算機的發展和組成由相當的了解,也許這不是乙個容易的過程,但必須是乙個前進的方向。每次遇到技術瓶頸,如果能夠重新學習計算機系統的知識,必定會有另外的發現。例如多看看 深入理解計算機系統 2。通過軟體我們實現邏輯表達,通過硬體我們真正完成控制實質。從某些程度上講,硬體和...
2016 1 12個人總結
總結一下 1.類方法與例項方法 減號 代表例項方法,它在類的乙個具體例項範圍內執行,也就是說,你咋呼叫這個方法之前必須先建立乙個類的例項 加號 代表類方法,可以通過類名直接呼叫,不需要建立乙個類的例項。呼叫 例項方法 例項物件 方法名 如 yjview yv yjview alloc init yv...
2016個人總結
個人總結 忙碌的2016年在公司總結大會圓滿的畫上了句號。自己在csdn上寫一些總結。二 在工作上不要聽信任何人,要將問題鑽研透徹。只有這樣才能真正的懂了。只有這樣才能在遇到問題時為自己找到話語權。三 自己在工作上有拖延的問題,我認為還是由於不夠重視造成的。手頭上快一些,留出時間幹自己想幹的事情。四...