你有一條項鍊,它由 N 個隨機排列的紅、白和藍色的珠子組成(3<=N<=350)。下面的例子展示了兩條 N=29 時的項鍊:
1 2 1 2 r b b r b r r b r b b b r r b r r r w r b r w w b b r r b b b b b b r b r r b r b r r r b r r r r r r b r b r r r w Figure A Figure B r red bead b blue bead w white bead
項鍊上的第一個和第二個珠子已經在圖中標出了。
圖 A 也可以用一個由 b 和 r 組成的字符串直接表示,b 代表藍色而 r 代表紅色,如下所示:brbrrrbbbrrrrrbrrbbrbbbbrrrrb。
假設你想從項鍊的某處將它截斷拉直;接着從一端向另外一端數收集同顏色的珠子,直到碰到一個不同顏色的珠子爲止;然後再從另外一端做同樣的操作。(一端收集的珠子顏色可以不同於另一端的。)
請想辦法找到一個截斷項鍊的位置,能夠讓我們儘量多地收集到同色的珠子。
例子
如圖 A 中的項鍊,從第 9 和第 10 個或者第 24 和 第 25 個珠子中間截斷,則我們可以收集到 8 個珠子。
圖 B 中的項鍊有白色的珠子,當遇到白色的珠子時,它既可以作爲藍色的珠子看待,也可以作爲紅色的珠子看待,由收集珠子時的需求決定。包含有白色珠子的項鍊則會由 r、b 和 w 字符組成的字符串來表示。
請編寫一個程序計算從某條項鍊中能夠收集到多少個珠子。
輸入格式
第一行: N,項鍊上珠子的個數
第二行:一個字符串,長度爲 N,由 r、b 和 w字符組成
輸入樣例
29 wwwbbrwrbrbrrbrbrwrwwrbwrwrrb
輸出格式
輸出一行字符,它應該包含了計算出的結果。
輸出樣例
11
看着這是一個不錯的題,如果數據量足夠大的話可以進行剪枝或者什麼更好的方法,可惜數據量太水,直接一次循環就能過~
#include<stdio.h>
#include<string.h>
char readin[750];
int main()
{
int n;
scanf("%d%s", &n, readin);
int i;
for (i = 0; i < n; i++)
readin[n + i] = readin[i];
int maxe = 0;
int j;
int index1, index2;
int flag1, flag2;
for (i = 0; i < n; i++)
{
index1 = 0; index2 = 0;
flag1 = 0; flag2 = 0;
for (j = i; j < n+i; j++)
{
if (readin[j] == 'b' && flag1!=2)
flag1 = 1;
if (readin[j] == 'r' && flag1!=1)
flag1 = 2;
if ((readin[j] == 'b'&&flag1 == 2) || (readin[j] == 'r'&&flag1 == 1))
break;
index1++;
}
for (j = n + i - 1; j >= i; j--)
{
if (readin[j] == 'b' && flag2 != 2)
flag2 = 1;
if (readin[j] == 'r' && flag2 != 1)
flag2 = 2;
if ((readin[j] == 'b'&&flag2 == 2) || (readin[j] == 'r'&&flag2 == 1))
break;
index2++;
}
maxe = maxe > (index1 + index2) ? maxe : (index1 + index2);
}
if (maxe > n)
maxe = n;
printf("%d\n", maxe);
return 0;
}