2018-3-25
昨天晚上有人评论了我的博客,有点小激动,今天就把自己之前写的博客整理了一下,发现自己USACO里面有一道题目没有写博客…于是乎把它给补上。
题目大意:
给你一串项链,白色,蓝色,红色,白色可以替换为任意颜色,从某个地方,
剪短该项链,问你从两边所能得到的珠子和的最大值为多少,每一边得到的
珠子数为到第一个不同颜色的珠子截止(w色可以进行替换)。
我们最容易想到的,就是枚举从每一个地方剪断所能获得的两边的和,然后求得最大值。需要我们注意的就是该题目给我们的是一个环。
/*
ID: 18795871
PROG: beads
LANG: C++
*/
#include<iostream>
#include<fstream>
using namespace std;
ifstream fin("beads.in");
ofstream fout("beads.out");
const int N = 350;
char x[2*N+10],y[2*N+10];
int lef[N+10],rig[N+10];
int n;
int main(){
int i,j;
while (fin>>n){
fin>>x;
for (i=0;i<n;i++){
x[i+n]=x[i];
}
for (i=0;i<2*n;i++){
y[2*n-i-1]=x[i];
}
for (int i=0;i<=n;i++) lef[i]=1;
for (int i=0;i<=n;i++) rig[i]=1;
int cnt;
for (i=0;i<=n;i++){
char f=x[i];
for (j=i+1;j<2*n;j++){
if (x[j]==f){
lef[i]++;
}else{
if (f=='w'){
f=x[j];
lef[i]++;
}else if (x[j]=='w'){
lef[i]++;
}else{
break;
}
}
}
}
for (i=0;i<=n;i++){
char f=y[i];
for (j=i+1;j<2*n;j++){
if (y[j]==f){
rig[i]++;
}else{
if (f=='w'){
f=y[j];
rig[i]++;
}else if (y[j]=='w'){
rig[i]++;
}else{
break;
}
}
}
}
int ma=0;
for (int i=0;i<=n;i++){
ma=max(ma,lef[i]+rig[n-i]);
}
if (ma>n) fout<<n<<endl;
else fout<<ma<<endl;
}
return 0;
}