本题我不会写,囧,看了官方的代码,算法复杂度为O(n^2),学习下:
/* ID:twd30651 PROG:beads LANG:C++ */ #include<iostream> #include<fstream> #include<string.h> using namespace std; int N; char s[400]; int len; int mod(int n,int m) { while(n<0)n+=m; return n%m;//值得学习,跑一圈又回来 } int nbreak(int p,int dir) { int i; int n; if(dir>0) i=p; else i=mod(p-1,len); char color='w';//用color来保存颜色 for(n=0;n<len;i=mod(i+dir,len)) { if(color=='w'&&s[i]!='w') color=s[i];//处理收集珠子时颜色的变换 else if(color!=s[i]&&s[i]!='w') break; n++; } return n; } int main(int argc,char *argv[]) { freopen("beads.in","r",stdin); freopen("beads.out","w",stdout); int i=0; scanf("%d",&N); scanf("%s",s); len=strlen(s); int n; int m=0; for(i=0;i<len;++i) { n=nbreak(i , 1)+nbreak(i,-1);//兵分两路 if(n>m) m=n; } if(m>len)//考虑转了一圈,又回来了,类似于"rrrrrr"这样的字符串 m=len; printf("%d\n",m); return 0; }
下面一种方法是dp,时间复杂度为O(n)
/* ID:twd30651 PROG:beads LANG:C++ */ #include<iostream> #include<fstream> #include<stdlib.h> #include<string.h> using namespace std; /* copy: 用数组bl,br,rl,rr分别记录在项链i处向左向右收集的蓝色红色珠子数。 项链是环形的,但我们只要把两个同样的项链放在一块,就把它转换成线性的了。 我们只要求出bl,br,rl,rr,那么结果就是max(max(bl[i],rl[i])+max(br[i+1],rr[i+1])) (0<=i<=2*n-1)。 我们以求bl,rl为例: 初始时bl[0]=rl[0]=0 我们从左往右计算 如果necklace[i]='r',rl[i]=rl[i-1]+1,bl[i]=0; 如果necklace[i]='b', bl[i]=bl[i-1]+1,rl[i]=0; 如果necklace[i]='w',bl[i]=bl[i-1]+1,rl[i]=rl[i-1]+1。 同理可以求出br,rr。 */ typedef struct node { int lr;//向左最多红色珠子 int lb;//向左最多蓝色珠子 int rr;//向右最多红色珠子 int rb;//向右最多蓝色珠子 }node; node necklace[800]; char s[800]; char tmp[400]; int N; int main(int argc,char *argv[]) { freopen("beads.in","r",stdin); freopen("beads.out","w",stdout); int i=0; scanf("%d",&N); scanf("%s",s); strcpy(tmp, s); //也是珠子加上它自己的一个副本 strcat(s, tmp); necklace[0].lr=0; necklace[0].lb=0; for(int i=1;i<=2*N;++i) { if(s[i-1]=='r') necklace[i].lr=necklace[i-1].lr+1,necklace[i].lb=0; else if(s[i-1]=='b') necklace[i].lb=necklace[i-1].lb+1,necklace[i].lr=0; else necklace[i].lb=necklace[i-1].lb+1, necklace[i].lr=necklace[i-1].lr+1; } necklace[2*N].rr=0; necklace[2*N].rb=0; for(int i=2*N-1;i>=0;--i) { if(s[i]=='r') necklace[i].rr=necklace[i+1].rr+1,necklace[i].rb=0; else if(s[i]=='b') necklace[i].rb=necklace[i+1].rb+1,necklace[i].rr=0; else necklace[i].rb=necklace[i+1].rb+1, necklace[i].rr=necklace[i+1].rr+1; } int m=0; for(int i=0;i<2*N;++i) m=max(m,max(necklace[i].lr,necklace[i].lb) + max(necklace[i].rr, necklace[i].rb)); if(m>N) m=N; printf("%d\n",m); return 0; }
时间: 2024-10-20 12:02:12