USACO1.1Broken Necklace[环状DP作死]
题目描述
你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的。 这里是 n=29 的二个例子:
第一和第二个珠子在图片中已经被作记号。
图片 A 中的项链可以用下面的字符串表示:
brbrrrbbbrrrrrbrrbbrbbbbrrrrb
假如你要在一些点打破项链,展开成一条直线,然后从一端开始收集同颜色的珠子直到你遇到一个不同的颜色珠子,在另一端做同样的事(颜色可能与在这之前收集的不同)。 确定应该在哪里打破项链来收集到最大数目的珠子。
例如,在图片 A 中的项链中,在珠子 9 和珠子 10 或珠子 24 和珠子 25 之间打断项链可以收集到8个珠子。
白色珠子什么意思?
在一些项链中还包括白色的珠子(如图片B) 所示。
当收集珠子的时候,一个被遇到的白色珠子可以被当做红色也可以被当做蓝色。
表现含有白珠项链的字符串将会包括三个符号 r , b 和 w 。
写一个程序来确定从一条被给出的项链可以收集到的珠子最大数目。
输入输出格式
输入格式:
第 1 行: N, 珠子的数目
第 2 行: 一串长度为N的字符串, 每个字符是 r , b 或 w。
输出格式:
输入输出样例
29 wwwbbrwrbrbrrbrbrwrwwrbwrwrrb
11
说明
题目翻译来自NOCOW。
USACO Training Section 1.1
----------------------------------
搜索太没意思了,就开始用DP做死,线性复杂度就可以;
先确定不是全一样
f :从i开始 d:到i结束
0 :红色 1 :蓝色
找到一个r与b的分界点,从它开始愉快的扫描更新就可以了
因为是环状,自己yy了一个loop标记,反正实现循环了
[PS]:貌似人家爆搜的时间和我差不多,N太小了,唉
// // main.cpp // usaco1.1 // // Created by abc on 16/8/14. // Copyright © 2016年 abc. All rights reserved. // #include <iostream> #include <cstdio> #include <cmath> using namespace std; const int N=400; int n,ans=1; char c[N]; int f[N][2],d[N][2],only=0; //only 0--->all same //0 red 1 blue inline int nxt(int i){return (i+1)%n; } inline int lst(int i){return (i-1+n)%n; } void init(){for(int i=0;i<n;i++) if(c[i]=='r') only=1;if(only==0) return;for(int i=0;i<n;i++) if(c[i]=='b') only=1;if(only==0) return;int st=0;for(int i=1;i<n;i++) if(abs(c[i]-c[i-1])==16) {st=i-1;break;}bool loop=0;for(int i=st;loop==0||i!=st;i=lst(i)){//printf("for1 %d\n",i);loop=1;if(c[i]=='r') f[i][0]=f[nxt(i)][0]+1,f[i][1]=0;if(c[i]=='b') f[i][1]=f[nxt(i)][1]+1,f[i][0]=0;if(c[i]=='w') f[i][0]=f[nxt(i)][0]+1,f[i][1]=f[nxt(i)][1]+1;}st++;loop=0;for(int i=st;loop==0||i!=st;i=nxt(i)){//printf("for2 %d\n",i);loop=1;if(c[i]=='r') d[i][0]=d[lst(i)][0]+1,d[i][1]=0;if(c[i]=='b') d[i][1]=d[lst(i)][1]+1,d[i][0]=0;if(c[i]=='w') d[i][0]=d[lst(i)][0]+1,d[i][1]=d[lst(i)][1]+1;}} int main(int argc, const char * argv[]) {scanf("%d",&n);for(int i=0;i<n;i++) cin>>c[i];init();if(only==0) ans=n;else for(int i=0;i<n;i++){int t=max(f[i][0]+d[lst(i)][1],f[i][1]+d[lst(i)][0]);ans=max(ans,t);}cout<<ans;}
USACO1.1Broken Necklace[环状DP作死]相关推荐
- FZU - 2302 Necklace (dp+斜率优化)
I - Necklace FZU - 2302 题目大意:给出一个环每一段的价值为区间和的平方,求将环断成k断的最小价值之和. 解题思路:容易想到n^4的dp 首先断环成链,将数组复制一遍. 用dp[ ...
- POJ_2228 Naptime ( 环状dp )
文章目录 题意 题解 代码 vj or poj 题意 一天由n个小时构成,在第i个小时睡觉能够恢复Ui点体力.有一头牛要休息b个小时,可以不连续,但休息的第1个小时无法恢复体力.前一天的最后一个小时和 ...
- TYVJ P1062 合并傻子 Label:环状dp
背景 从前有一堆傻子,钟某人要合并他们~ 但是,合并傻子是要掉RP的...... 描述 在一个园形操场的四周站着N个傻子,现要将傻子有次序地合并成一堆.规定每次只能选相邻的2个傻子合并成新的一个傻子, ...
- HOJ题目分类//放这儿没事刷刷学算法!嘻嘻!
各种杂题,水题,模拟,包括简单数论. 1001 A+B 1002 A+B+C 1009 Fat Cat 1010 The Angle 1011 Unix ls 1012 Decoding Task 1 ...
- 【Gym - 101196F】Removal Game (环形区间dp,环状,细节优化)
题干: 健健开发了一个游戏叫做<<者护守形隐>>,里面有一个情节是这样的,女主子纯藤武被坏人关在了密室里,作为男主的肖健当然要英雄救美.但是要打开密室的门,必须解开一道谜题. ...
- 洛谷 P1203 [USACO1.1]坏掉的项链Broken Necklace
P1203 [USACO1.1]坏掉的项链Broken Necklace 题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 ...
- BZOJ3075[USACO 2013 Mar Gold 3.Necklace]——AC自动机+DP
题目描述 给你一个长度为n的字符串A,再给你一个长度为m的字符串B,求至少在A中删去多少个字符才能使得B不是A的子串.注:该题只读入A和B,不读入长度,先读入A,再读入B.数据保证A和B中只含小写字母 ...
- P1216 [IOI1994][USACO1.5]数字三角形 Number Triangles(简单dp)
https://www.luogu.org/problemnew/show/P1216 题目描述 观察下面的数字金字塔. 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大.每一步 ...
- 【USACO1.1】Broken Necklace
题意 一个环形项链,有rbw三种珠子,r代表red,b代表blue,w代表white,从任意一个位置断开,两端分别取珠子,同一端取的珠子要相同颜色,w可以染成想要的颜色,即既可当作r也可以当作b,求最 ...
最新文章
- 数据驱动:新药物发现知识图
- Lua编译实践1-词法分析:
- 题临安邸 【南宋】 林升
- deepin--eclipse安装与配置
- python自动化办公:邮件篇 (定时邮件问候女票so easy)
- solr5.3.1 集成IK中文分词器
- 《Ext JS权威指南》——2.4节关于Ext.onReady
- android开发自动提示框,Android 多种简单的弹出框样式设置代码
- awk 内嵌正则 提取字符串_使用awk提取字符串中的数字或字母
- UWP 手绘视频创作工具技术分享系列 - 位图的绘制
- (转)MyBatis框架的学习(三)——Dao层开发方法
- spring的一些概念及优点
- [洛谷P4234]最小差值生成树
- nginx 站点使用try_files配置案例
- matlab图像加椒盐噪声,用matlab给图像加高斯噪声和椒盐噪声(不调用imnoise函数)...
- 蝰蛇音效音效包_用数据科学分析音效迷艺术
- PART 1.3 风控利率那些事儿(名义利率 实际利率 还款方式 以及 计算逻辑汇总)
- 数据库中update的用法
- 计算机硬盘显示offline,LSI芯片Raid卡一块硬盘显示红色Offline(或者Failed)
- python正则表达式爬取链家租房信息