P1203 [USACO1.1]壞掉的項鍊Broken Necklace(環的問題)

P1203 [USACO1.1]壞掉的項鍊Broken Necklace
題目描述
你有一條由 nn 個紅色的,白色的,或藍色的珠子組成的項鍊,珠子是隨意安排的。 這裏是 n=29n=29 的兩個例子:

在這裏插入圖片描述

第一和第二個珠子在圖片中已經被作記號。

圖片 A 中的項鍊可以用下面的字符串表示:

brbrrrbbbrrrrrbrrbbrbbbbrrrrb

假如你要在一些點打破項鍊,展開成一條直線,然後從一端開始收集同顏色的珠子直到你遇到一個不同的顏色珠子,在另一端做同樣的事(顏色可能與在這之前收集的不同)。 確定應該在哪裏打破項鍊來收集到最大數目的珠子。

例如,在圖片 A 中的項鍊中,在珠子 99 和珠子 1010 或珠子 2424 和珠子 2525 之間打斷項鍊可以收集到 88 個珠子。

白色珠子什麼意思?

在一些項鍊中還包括白色的珠子(如圖片B) 所示。

當收集珠子的時候,一個被遇到的白色珠子可以被當做紅色也可以被當做藍色。

表現含有白珠項鍊的字符串將會包括三個符號 r,b,w 。

寫一個程序來確定從一條被給出的項鍊可以收集到的珠子最大數目。

輸入格式
第一行一個正整數 nn ,表示珠子數目。 第二行一串長度爲 nn 的字符串, 每個字符是 r , b 或 w。

輸出格式
輸出一行一個整數,表示從給出的項鍊中可以收集到的珠子的最大數量。

輸入輸出樣例
輸入 #1複製
29
wwwbbrwrbrbrrbrbrwrwwrbwrwrrb
輸出 #1複製
11
說明/提示
【數據範圍】
對於 100%100% 的數據,3\le n \le 3503≤n≤350
環的問題是把環複製一個或兩個成鏈解決。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
using namespace std;
const int N=2005;
const int inf=0x3f3f3f3f;
int ans=-1;
string a;
int f(int x){
	int s=0,i;
	char a1=a[x],b1=a[x+1];
	for(i=x;;i--){
		if(a[i]==a1||a[i]=='w') s++;
		else break;
	}
	for(i=x+1;;i++){
		if(a[i]==b1||a[i]=='w') s++;
		else break;
	}
	return s;
}
int main()
{
	int n,len,m,i,j,k,x,y;
	cin>>len>>a;
	a=a+a+a;
	for(i=len;i<len*2;i++){
		if(a[i]==a[i+1])
			continue;
		if(a[i]=='w'){
			a[i]='r'; ans=max(ans,f(i));
			a[i]='b'; ans=max(ans,f(i));
			a[i]='w';
		}
		ans=max(ans,f(i));
	}
	ans=min(ans,len);
	if(ans==-1) ans=len;
	printf("%d",ans);
	return 0;
}

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