品牌网站建设9小蝌蚪9,重庆网站推广营销价格,wordpress cnzz插件,vi设计开题报告题意 一个环形项链#xff0c;有rbw三种珠子#xff0c;r代表red#xff0c;b代表blue#xff0c;w代表white#xff0c;从任意一个位置断开#xff0c;两端分别取珠子#xff0c;同一端取的珠子要相同颜色#xff0c;w可以染成想要的颜色#xff0c;即既可当作r也可以…题意 一个环形项链有rbw三种珠子r代表redb代表bluew代表white从任意一个位置断开两端分别取珠子同一端取的珠子要相同颜色w可以染成想要的颜色即既可当作r也可以当作b求最多取得的珠子个数。最多有350个珠子。 分析 可以枚举断开的位置然后模拟取珠子。也可以枚举起点位置。还可以dp做。 代码 枚举断点 #includecstdio#includealgorithm#define N 355using namespace std;char a;int b[N];int n,ans;int solve(int p,int dir) //p为起始点dir为方向求最多取几颗{int len0;//取了的珠子个数最多取n颗珠子for(int jpn; lenn; len,jdir) //j为当前位置n当前位置为j%n {if(b[p] b[j%n] b[j%n]!b[p])break;if(!b[p])//每次取珠子都要符合p位置的颜色若p位置是w就要更新p pj%n; }return len;}int main(){scanf(%d ,n);for(int i0; in; i) { agetchar(); b[i]ab?1:ar?2:0;// b--1 r--2 w--0 }for(int i0; in; i)//枚举断点 ansmax(ans,solve(i,-1)solve(i1,1)); ansmin(ans,n);//可能同一颗被两次计算过但只出现在全都取的情况里printf(%d\n,ans);return 0;} 枚举起点 #includecstdio#includealgorithm#includeiostream#includestringusing namespace std;int n,ans;string s;int main(){cinns; ss;for(int i0,j; in; i) //以i为第一段的起点不是切开的位置 {char nows[i];int len0;int timesnoww?3:2;//如果当前是白色那么需要找三段相同颜色的否则找两段 ji;while(times--) {while(jin(s[j]now||s[j]w)) { len; j; } nows[j]; } ansmax(ans,len); }coutansendl;return 0;} DP #includecstdio#includeiostream#includealgorithm#includestring#define N 720using namespace std;int n,ans;string s;int l[N][2],r[N][2];int main(){cinns; ss;for(int i1;i2*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 i2*n-1;i0;i--){ r[i][0]r[i1][0]1; r[i][1]r[i1][1]1;if(s[i]r) r[i][1]0;else if(s[i]b) r[i][0]0; }for(int i0;i2*n;i) ansmax(ans,max(l[i][0],l[i][1])max(r[i][0],r[i][1])); ansmin(ans,n);coutansendl;return 0;}