题意:假如你要在一些点打破项链,展开成一条直线,然后从一端开始收集同颜色的珠子直到你遇到一个不同的颜色珠子,在另一端做同样的事(颜色可能与在这之前收集的不同)。 确定应该在哪里打破项链来收集到最大数目的珠子。
题解:DP 深搜
1. 将原字符串复制一份加在后面, 将链转换成线性关系
2. 创建四个数组:
(下标)在i-1 和 i 之间 分割
lb[i] , lr[i] 指左边最多(不包括下标为i)的蓝珠,红珠的个数
rb[i] , rr[i] 指右边最多(包括下标为i)的蓝珠,红珠的个数
/*
ID:jsntrdy1
PROG: beads
LANG: C++
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<fstream>
using namespace std;
ifstream fin("beads.in");
ofstream fout("beads.out");
const int N=360;
string str;
int lb[N*2],lr[N*2],rb[N*2],rr[N*2];
int main()
{
int n;
fin>>n>>str;
str+=str;
for(int i=1;i<=n*2;i++)
{
if(str[i-1]=='b')
lb[i]=lb[i-1]+1;
else if(str[i-1]=='r')
lr[i]=lr[i-1]+1;
else
{
lb[i]=lb[i-1]+1;
lr[i]=lr[i-1]+1;
}
}
for(int i=n*2-1;i>=0;i--)
{
if(str[i]=='b')
rb[i]=rb[i+1]+1;
else if(str[i]=='r')
rr[i]=rr[i+1]+1;
else
{
rb[i]=rb[i+1]+1;
rr[i]=rr[i+1]+1;
}
}
int ans=0;
for(int i=0;i<=n*2-1;i++)
ans=max(max(lb[i],lr[i])+max(rb[i],rr[i]),ans);
if(ans>=n)
ans=n;
fout<<ans<<endl;
return 0;
}