这道题还是花了不少时间的,首先是用普通的搜索写的,然而时间复杂度为O(n2),且对未处理好边界。接着用动态规划。既然是一个环,那就把这串字符复制一下接到原字符串的后面。然而给的样例中有一段是rbwr,当中的w会被前面的b使用,用完后r就直接丢弃了w,所以将w的值保存。但是还会有一串一样的字符,比如说6 wwwwww。所以就判断一下最后的结果max是否大于n。这个程序呢,是对动态规划的一个最初始的使用,后面还会有很多这样的题目,动态规划的好处就在于可以把复杂的程序简单化,将时间复杂度变小。代码如下。
#include <iostream>
#include <cstdio>
#include <cstring>
#include<cmath>
using namespace std;
int main (){
freopen ("beads.in","r",stdin);
freopen ("beads.out","w",stdout);
int n=0,maxn=0;
int x=0,y=0,i=0,w=0;
char t[720],c='0';
memset(t,0,sizeof(t));
cin>>n;
for(i=1;i<=n;i++){
cin>>t[i];
}
for (i=n+1;i<=2*n;i++){
t[i]=t[i-n];
}
for(i=0;i<=2*n;i++){
if(t[i]=='w'){
x++;
w++;
}
else if(t[i]==c){
x++;
w=0;
}
else{
maxn=max(y+x,maxn);
y=x-w;
x=w+1;
w=0;
c=t[i];
}
}
if (maxn<=x+y){
maxn=x+y;
}
if (maxn>=n){
maxn=n;
}
cout<<maxn<<endl;
return 0;
}