壊れたネックレス

あなたはNまたは青色ビーズによってネックレス(3 <= N <= 350)は、ビーズをランダムに配置され、白色組成赤色ました。ここで、N = 29の2つの例は以下のとおりです。

 

画像における第1および第2のビーズがマークされています。 

ネックレスの写真は以下の文字列で表すことができます。 

brbrrrbbbrrrrrbrrbbrbbbbrrrrb

あなたはいくつかの点でネックレスを破るしたい場合は、直線に展開し、次にあなたが同じことを行うためにもう一方の端に異なる色のビーズを打つまで、一端からビーズの同じ色を集めるようになった(色は以前にこの中に収集さにより変化し得ます)。どこネックレスブレークは、サブの数の最大数を収集するために決定しなければなりません。例えば、実施例では、画像Aのネックレスに、ビーズを8に収集することができ、ネックレス9との間に中断し10のビーズまたは24ビーズ、25個のビーズをビーズ。いくつかのネックレスでは、白画像を含むビーズは、Bに示すように ビーズを収集する場合、白いビーズが発生することができる青色として赤色の通りであることができます。パフォーマンスのネックレスの文字列は、3つのシンボルB、R、およびWが含まれます。ビーズの供給されたネックレスの最大数から収集することができるかを決定するためのプログラムを書きます。 

 

最初のパス:最も簡単

アイデア:

  図1に示すように、各キャラクタを通過「R」と「B」の「W」の出会いは、操作を実行します

  図2に示すように、二方向の動作を実行するための文字、なぜなら鎖切断二うち、各方向、さらに、二つのサブ方向を含むためのループ鎖クロール一方

  1の#include <iostreamの>
   2の#include <CStringの>
   3  使用して 名前空間をSTD。
  4  チャー ARR [ 360 ]。
  5  INT N。
  6  ボイド)(解く
   7  {
   8      // 初期
  9      のmemset(ARR、0360 * はsizeofCHAR ))。
10      CIN >> N。
11      cinを>> ARR。
12      // solveIt 
13      のint J、最大= 0 14      のためにINT iが= 0 ; iが<N; I ++ 15      {
 16          であれば(ARR [I] == ' W ' 17が             継続は18          // 'r'and'b'からのパス'W'、
19          INT MAX1 = 0、CT = 1 20          CHAR CH = ARR [I]。
21          J = I;
22          BOOL JDG = 23          // INORDER 
24          ながら(JDG)
 25         {
 26              // CT = 1 / CT = 2 
27              であれば(CT == 1 &&(ARR [J] == ' W ' || ARR [J] == CH))
 28              {
 29                  J =(J + 1)%N;
30                  MAX1 ++ ;
31              } そう であれば(CT == 1 && ARR [J] =!CH){
 32                  J =(I == 0)(N?1):( I- 1 )。
33                  カラット++ ;
34                  もし(ARR [J] == ' W ' || ARR [J] == CH){
 35                      MAX1 ++ 36                      J =(j == 0)(N?1):( J- 1 )。
37                  }
 38                  他の
39                  {
 40                      MAX1 ++ 41                      CH = ARR [J]。
42                      J =(j == 0)(N?1):( J- 1 )。
43                  }
 44              }そう であれば(CT == 2 &&(ARR [J] == ' W ' || ARR [J] == CH))
 45              {
 46                  MAX1 ++ 47                  J =(j == 0)(N?1):( J- 1 )。
48              } そう であれば(CT == 2 && ARR [J] = CH && ARR [J] =!' W ' 49              {
 50                  JDG = 51              }
 52              
53                 続け;
54              // 一般的な
55              であれば(MAX1> N){
 56                  MAX1 = N。
57                  JDG = ;
58              }
 59          }
 60          // バックオーダー
61          INT MAX2 = 0 62          CT = 1 63          JDG = ;
64          J =(I == 0)(N?1):( I- 1 )。
65          CH =[j]をARR。
66          一方(JDG)
 67          {
 68              であれば(CT == 1 &&(ARR [J] == ' W ' || ARR [J] == CH)){
 69                  J =(j == 0)?(N- 1):( J- 1 )。
70                  MAX2 ++ ;
71              } そう であれば(CT == 1 && ARR [J] =!CH){
 72                  J = I。
73                  カラット++ ;
74                  であれば(ARR [J] == ' W' || ARR [J] == CH){
 75                      MAX2 ++ 76                      J =(J + 1)%N。
77                  } {
 78                      CH = ARR [J]。
79                      MAX2 ++ ;
80                      J =(J + 1)%N。
81                  }
 82              } そう であれば(CT == 2 &&(ARR [J] == ' W ' || ARR [J] == CH)){
 83                 MAX2 ++ ;
84                  J =(J + 1)%N。
85              } そう であれば(CT == 2 && ARR [J] =!' W ' && ARR [J] =!CH){
 86                  JDG = 87              }
 88              であれば(MAX2> N){
 89                  MAX2 = N。
90                  JDG = ;
91              }
 92          }
 93          最大=最大> MAX1?最大:MAX1。
94          マックス=マックス> MAX2?最大:MAX2。
95      }
 96      であれば(最大)
 97          COUT <<最大<< ENDL。
98      他の
99          coutの<< N << てendl;
100  }
 101  INT メイン()
 102  {
 103      (解きます)。
104      戻り 0 ;
105 }
最初

 

 

 

 

おすすめ

転載: www.cnblogs.com/guoyujiang/p/11823521.html