Section 1.1 Broken Necklace

首先順序便利項鍊一次,計算出每個珠子向左能夠延伸的最長距離

在便利到結尾的時候,比較項鍊的開始部分與最後結尾處的珠子種類,如果相同對項鍊前面的部分進行更新。

 

然後同樣,倒敘相連一次,計算出每個珠子右向的最長距離

更新項鍊的最後部分

 

在做的過程中犯的錯誤:

(1)沒有考慮如果一整個項鍊是一種珠子的情況

(2)例如bwrwrr中在,第一個r的時候其實前面的w的也應該算入r的左鏈的;但是如果從w後面斷開的話,kw應該是一個鏈中的

因此我加入一個輔助數組wn(表示到位置i前有多少個w),如果遇到s[i-1]是w,而s[i]不是w的時候計算左鏈就用wn計算;

右鏈的計算同理。

 

感覺這樣子計算用到的輔助數組比較多

 

 

#include <fstream>
#include <iostream>
#include <string>

using namespace std;

int main()
{
 ifstream fin("beads.in");
 ofstream fout("beads.out");
 int n;//珠子數目
 string s;//項鍊
 fin>>n>>s;
 int right[350] = {0};
 int lef[350] = {0};
 int wnl[350] = {0};//左數,w個數
 int wnr[350] = {0};//右數,w個數
 int bp[350] = {0};//分割點

 char c = 0;
 
 int i;//循環
 //找到左邊的最大串
 for (i = 0; i < n; i++)
 {
  //統計連續w的個數
  if(i > 0 && s[i] == 'w' && s[i-1] == 'w')
  {
   wnl[i] = wnl[i-1] + 1;
  }
  //計算連續相同珠子的個數
  if (s[i] == c || s[i] == 'w')
  {
   lef[i] = lef[i-1] + 1;
  }
  else
  {
   if(s[i-1] == 'w')
   {
    lef[i] = wnl[i-1] + 1;
   }
  }
  if('w' != s[i])
  {
   c = s[i];
  }
  //cout<<wnl[i]<<" ";
 }
 //根據最後一個珠子,更新開始的幾個珠子
 if (s[0] == c || s[0] == 'w')
 {
  lef[0] = lef[n-1] + 1;
  //cout<<endl<<lef[0];
  int temp = 1;
  while ((temp <= n-1) && (s[temp] == c || s[temp] == 'w'))
  {
   lef[temp] = lef[temp-1] + 1;
   temp++;
  }
  
 }
 //找到右邊的最大串
 c = 0;
 for (i = n-1; i >= 0; i--)
 {
  //統計連續w的個數
  if(i < n-1 && s[i] == 'w' && s[i+1] == 'w')
  {
   wnr[i] = wnr[i+1] + 1;
  }

  if (s[i] == c || s[i] == 'w')
  {
   right[i] = right[i+1] + 1;
  }
  else
  {
   if(s[i+1] == 'w')
   {
    right[i] = wnr[i+1] +1;
   }
  }
  if('w' != s[i])
  {
   c = s[i];
  }
 }
 //根據第一個珠子,更細最後幾個珠子
 if (s[n-1] == c || s[n-1] == 'w')
 {
  right[n-1] = right[0] + 1;
  //cout<<right[n-1];
  int temp = n-2;
  while (temp >= 0 && (s[temp] == c || s[temp] == 'w'))
  {
   right[temp] = right[temp+1] + 1;
   temp--;
  }
 }
 //最大點位置切開,珠子數目
 int p = -1;
 for (i = 0; i < n; i++)
 {
  if (i == n-1)
  {
   bp[i] = lef[i] +right[0] + 2;
  }
  else
  {
   bp[i] = lef[i] + right[i+1] + 2;
  }
  if (bp[i] > p)
  {
   p = bp[i];
  }
  //cout<<lef[i]<<" "<<right[i]<<endl;
 }
 //如果是純色的珠子
 if(p > n)
  p = n;
 fout<<p<<endl;
 //cout<<endl<<p<<endl;
 return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章