题意
一个环形项链,有rbw三种珠子,r代表red,b代表blue,w代表white,从任意一个位置断开,两端分别取珠子,同一端取的珠子要相同颜色,w可以染成想要的颜色,即既可当作r也可以当作b,求最多取得的珠子个数。最多有350个珠子。
分析
可以枚举断开的位置,然后模拟取珠子。也可以枚举起点位置。还可以dp做。
代码
枚举断点
#include#include #define N 355 using namespace std; char a; int b[N]; int n,ans; int solve(int p,int dir) //p为起始点,dir为方向,求最多取几颗 { int len=0;//取了的珠子个数,最多取n颗珠子 for(int j=p+n; len
枚举起点
#include#include #include #include using namespace std; int n,ans; string s; int main() { cin>>n>>s; s+=s; for(int i=0,j; i
DP
#include#include #include #include #define N 720 using namespace std; int n,ans; string s; int l[N][2],r[N][2]; int main(){ cin>>n>>s; s+=s; for(int i=1;i<2*n;i++){ l[i][0]=l[i-1][0]+1; l[i][1]=l[i-1][1]+1; if(s[i-1]=='r') l[i][1]=0; else if(s[i-1]=='b') l[i][0]=0; } for(int i=2*n-1;i>=0;i--){ r[i][0]=r[i+1][0]+1; r[i][1]=r[i+1][1]+1; if(s[i]=='r') r[i][1]=0; else if(s[i]=='b') r[i][0]=0; } for(int i=0;i<2*n;i++) ans=max(ans,max(l[i][0],l[i][1])+max(r[i][0],r[i][1])); ans=min(ans,n); cout< <