NECKLACE section1.1 个人题解
来源:互联网 发布:java中匿名内部类 编辑:程序博客网 时间:2024/06/05 17:23
题目大意
给定一串由三种珠子构成的项链,珠子的种类分为红色的r,蓝色的b,白色的w; 项链是个圈,按顺序由一串字符表示,如: r b b r 1 r b 2 r r r r b r 位置3--> <--位置2 w b b b b b <--位置1 r r b r b r r r r b r 用字符串rbrrrbbbrrrrrbrrbbrbbwbrrrrbb表示。 在项链上挑一个位置剪开,从剪开位置向两端收集连续的且同色的珠子,收集到的珠子总数记为N,求N的最大值。 如图,在位置1剪开,向两端分别收集到5个红珠子与3个蓝珠子,N1=8;在位置2剪开,向两端分别收集到3个红珠子与三个蓝珠子,N2为6;在位置3剪开,向两端分别收集到3个蓝珠子和1个蓝珠子。 如果遇到白珠子,则白珠子可以当作红珠子,也可以当作蓝珠子。
输入格式:
line 1:N(表示一串项链上的珠子总数)line 2:N个字符的字符串(表示这一串珠子)
输出格式
one line:Nmax(表述取得的最大珠子数)
样例输入
29rbrrrbbbrrrrrbrrbbrbbwbrrrrbb(如上图)
样例输出
8
题解:
从结果来看,收集珠子数最大的剪开位置某一端收集到的珠子只可能是红珠子或者蓝珠子(每一个剪开位置都是如此)。同时,最大收集珠子数一定等于左端可收集的最大珠子数加上右端可收集的最大珠子数。 依据上述前提提出如下算法:任取一个剪开点,假设先从左端开始收集(从右端先开始效果对称),则有两种情况,收集最大可能的红色珠子(情况1)或收集最大可能的蓝色珠子(情况2)(当收集红色珠子时,白色珠子当作红色珠子;同样,当收集蓝色珠子时,白色珠子当作蓝色珠子)。 在上述两种情况的基础上,又分别有两种情况:右端收集红色珠子(情况11和情况21),右端收集蓝色珠子(情况12和情况22)。 求得四种情况下的左端收集数与右端收集数之和,取最大的和作为该剪开点下的收集数N。 遍历所有剪开点,求出所有剪开点下的收集数N,取最大的,即为Nmax。 需要注意的是:右端取珠子是在左端取珠子的基础上取的,所以右端取珠子需要避免重复取左端已经取过的珠子! 同时,由于项链为环形,可以考虑用数组读入之后,在原数组后粘贴上同样的一个数组,这样便可以实现在环形条件下取珠子。
代码:
#include<stdio.h>int max(int a,int b){if(a>b) return a;else return b;}int min(int a,int b){if(a>b) return b;else return a;}int main(){char bead[400],beads[800];intlen[800],num,n,lb=0,lr=0,rb=0,rr=0,maxb,maxr,maxm,i,j;scanf("%d",&num);scanf("%s",bead);n=2*num;for(i=0;i<num;i++){ beads[i]=bead[i]; beads[i+num]=bead[i];}for(i=0;i<n;i++){ lb=0; lr=0; rb=0; rr=0; j=i; while(j>=max(0,i-num+1)) { if(beads[j]=='b'||beads[j]=='w') {lb++;j--;} else break; } j=i+1; while(j<min(n,i+num-lb+1)) { if(beads[j]=='b'||beads[j]=='w') {rb++;j++;} else break; } j=i+1; while(j<min(n,i+num-lb+1)) { if(beads[j]=='r'||beads[j]=='w') {rr++;j++;} else break; } len[i]=max(lb,lr)+max(rb,rr);}maxb=len[0];for(i=0;i<n-1;i++){ if(maxb<len[i]) maxb=len[i];}for(i=0;i<n;i++){ lb=0; lr=0; rb=0; rr=0; j=i; while(j>=max(0,i-num+1)) { if(beads[j]=='r'||beads[j]=='w') {lr++;j--;} else break; } j=i+1; while(j<min(n,i+num-lr+1)) { if(beads[j]=='b'||beads[j]=='w') {rb++;j++;} else break; } j=i+1; while(j<min(n,i+num-lr+1)) { if(beads[j]=='r'||beads[j]=='w') {rr++;j++;} else break; } len[i]=max(lb,lr)+max(rb,rr);}maxr=len[0];for(i=0;i<n-1;i++){ if(maxr<len[i]) maxr=len[i];}maxm=max(maxb,maxr);fprintf(fout,"%d\n",maxm);return 0;}
阅读全文
0 0
- NECKLACE section1.1 个人题解
- USACO--Section1.1--Broken Necklace
- USACO-Section1.1 Broken Necklace
- USACO-Section1.1 Broken Necklace
- USACO-Section1.1 Broken Necklace
- USACO-Section1.1 Broken Necklace[...]
- USACO Section1.1 Broken Necklace
- USACO-Section1.1 Broken Necklace [动态规划]
- USCAO-Section1.1 Broken Necklace(DP版)
- USACO-Section1.1 Broken Necklace【记忆化搜索】
- USCAO-Section1.1 Broken Necklace(暴力枚举版dp版待更新)
- USACO之Section1.1.4 Broken Necklace
- 【题解】[hdu3874]Necklace
- [usaco]Broken Necklace题解
- 【USACO】【贪心】Section1.3 Mixing Milk 题解
- USACO Training Section1.1
- gift1-section1.1
- Friday the Thirteenth-section1.1
- C语言-数据结构-克鲁斯卡尔kruskal
- iOS 保持界面流畅性能优化
- 导航标题的设置影响UItabBar的标题解决方法集合
- php识别文件编码,并读出内容,对大文件也很有效率
- 基于Python语言使用RabbitMQ消息队列(三)
- NECKLACE section1.1 个人题解
- Jquery基础2-事件
- vue-zhihu-daily知乎日报
- C语言-数据结构-prim算法求最小生成树
- 【PMP认证考试之个人总结】第 8 章 人力资源管理
- 【转】Makefile中的foreach函数
- mysql的操作语句
- atomic包的原理及分析
- android Rxjava 使用心得