题意:
图片 A 中的项链可以用下面的字符串表示:
brbrrrbbbrrrrrbrrbbrbbbbrrrrb
假如你要在一些点打破项链,展开成一条直线,然后从一端开始收集同颜色的珠子直到你遇到一个不同的颜色珠子,在另一端做同样的事(颜色可能与在这之前收集的不同)。 确定应该在哪里打破项链来收集到最大数目的珠子。
思路:
看是dp,但是实际上可以当做模拟题做,暴力的枚举断点,然后模拟往左找,往右找,输出最大的值,但是由于有个万能的w,处理的十分麻烦,这里有给很清晰的代码,贴贴
#include<bits/stdc++.h>
using namespace std;
string a;
int f(int x)
{
int s=0;
char a1=a[x];
char b2=a[x+1];
for(int i=x;;i--)//往前看和往后看
{
if(a[i]==a1)s++;
else if(a[i]=='w')
s++;
else
break;
}
for(int i=x+1;;i++)
{
if(a[i]==b2)s++;
else if(a[i]=='w')
s++;
else
break;
}
return s;
}
int main()
{
int ans,n;
ans=-1;
cin>>n;cin>>a;
a=a+a+a;
for(int i=n;i<2*n;i++)//三段 从中间那一段开始处理
{
if(a[i]==a[i+1])
continue;
if(a[i]=='w')//这TMD硬是看的到第三个点 要不然真不会
{
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,n);//最长也不能比总长长
if(ans==-1)ans=n;//出现这种情况必定是一路continue过来的
cout<<ans<<endl;
return 0;
}