你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的。 这里是 n=29 的二个例子:
第一和第二个珠子在图片中已经被作记号。
图片 A 中的项链可以用下面的字符串表示:
brbrrrbbbrrrrrbrrbbrbbbbrrrrb
假如你要在一些点打破项链,展开成一条直线,然后从一端开始收集同颜色的珠子直到你遇到一个不同的颜色珠子,在另一端做同样的事(颜色可能与在这之前收集的不同)。 确定应该在哪里打破项链来收集到最大多数的数目的子。 Example 举例来说,在图片 A 中的项链,可以收集到8个珠子,在珠子 9 和珠子 10 或珠子 24 和珠子 25 之间打断项链。 在一些项链中,包括白色的珠子如图片 B 所示。 当收集珠子的时候,一个被遇到的白色珠子可以被当做红色也可以被当做蓝色。 表现项链的字符串将会包括三符号 r , b 和 w 。 写一个程序来确定从一条被供应的项链最大可以被收集珠子数目。
第一遍:最直白
思路:
1、遍历每一个字符,遇到‘w’则pass,‘r’和‘b’执行操作
2、对于执行操作的字符,分两个方向,因为断链出来了两段;对于每一个方向,还包含两个子方向,使用while循环进行爬链
1 #include <iostream>
2 #include <cstring>
3 using namespace std;
4 char arr[360];
5 int n;
6 void solve()
7 {
8 //Init
9 memset(arr,0,360*sizeof(char));
10 cin>>n;
11 cin>>arr;
12 //solveIt
13 int j,Max=0;
14 for(int i=0; i<n; i++)
15 {
16 if(arr[i]=='w')
17 continue;
18 //pass 'w',from 'r'and'b'
19 int max1=0,ct=1;
20 char ch = arr[i];
21 j = i;
22 bool jdg = true;
23 //inOrder
24 while(jdg)
25 {
26 //ct=1/ct=2
27 if(ct==1&&(arr[j]=='w'||arr[j]==ch))
28 {
29 j = (j+1)%n;
30 max1++;
31 }else if(ct==1&&arr[j]!=ch){
32 j = (i==0)?(n-1):(i-1);
33 ct++;
34 if(arr[j]=='w'||arr[j]==ch){
35 max1++;
36 j = (j==0)?(n-1):(j-1);
37 }
38 else
39 {
40 max1++;
41 ch = arr[j];
42 j = (j==0)?(n-1):(j-1);
43 }
44 }else if(ct==2&&(arr[j]=='w'||arr[j]==ch))
45 {
46 max1++;
47 j = (j==0)?(n-1):(j-1);
48 }else if(ct==2&&arr[j]!=ch&&arr[j]!='w')
49 {
50 jdg = false;
51 }
52 else
53 continue;
54 //general
55 if(max1>n){
56 max1 = n;
57 jdg=false;
58 }
59 }
60 //backOrder
61 int max2=0;
62 ct=1;
63 jdg = true;
64 j = (i==0)?(n-1):(i-1);
65 ch = arr[j];
66 while(jdg)
67 {
68 if(ct==1&&(arr[j]=='w'||arr[j]==ch)){
69 j = (j==0)?(n-1):(j-1);
70 max2++;
71 }else if(ct==1&&arr[j]!=ch){
72 j = i;
73 ct++;
74 if(arr[j]=='w'||arr[j]==ch){
75 max2++;
76 j = (j+1)%n;
77 }else{
78 ch = arr[j];
79 max2++;
80 j = (j+1)%n;
81 }
82 }else if(ct==2&&(arr[j]=='w'||arr[j]==ch)){
83 max2++;
84 j = (j+1)%n;
85 }else if(ct==2&&arr[j]!='w'&&arr[j]!=ch){
86 jdg=false;
87 }
88 if(max2>n){
89 max2 = n;
90 jdg=false;
91 }
92 }
93 Max = Max>max1?Max:max1;
94 Max = Max>max2?Max:max2;
95 }
96 if(Max)
97 cout<<Max<<endl;
98 else
99 cout<<n<<endl;
100 }
101 int main()
102 {
103 solve();
104 return 0;
105 }