题目描述

你有一条由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。

输出格式:

输入输出样例

输入样例#1:

29
wwwbbrwrbrbrrbrbrwrwwrbwrwrrb

输出样例#1:

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作死]相关推荐

  1. FZU - 2302  Necklace (dp+斜率优化)

    I - Necklace FZU - 2302 题目大意:给出一个环每一段的价值为区间和的平方,求将环断成k断的最小价值之和. 解题思路:容易想到n^4的dp 首先断环成链,将数组复制一遍. 用dp[ ...

  2. POJ_2228 Naptime ( 环状dp )

    文章目录 题意 题解 代码 vj or poj 题意 一天由n个小时构成,在第i个小时睡觉能够恢复Ui点体力.有一头牛要休息b个小时,可以不连续,但休息的第1个小时无法恢复体力.前一天的最后一个小时和 ...

  3. TYVJ P1062 合并傻子 Label:环状dp

    背景 从前有一堆傻子,钟某人要合并他们~ 但是,合并傻子是要掉RP的...... 描述 在一个园形操场的四周站着N个傻子,现要将傻子有次序地合并成一堆.规定每次只能选相邻的2个傻子合并成新的一个傻子, ...

  4. HOJ题目分类//放这儿没事刷刷学算法!嘻嘻!

    各种杂题,水题,模拟,包括简单数论. 1001 A+B 1002 A+B+C 1009 Fat Cat 1010 The Angle 1011 Unix ls 1012 Decoding Task 1 ...

  5. 【Gym - 101196F】Removal Game (环形区间dp,环状,细节优化)

    题干: 健健开发了一个游戏叫做<<者护守形隐>>,里面有一个情节是这样的,女主子纯藤武被坏人关在了密室里,作为男主的肖健当然要英雄救美.但是要打开密室的门,必须解开一道谜题. ...

  6. 洛谷 P1203 [USACO1.1]坏掉的项链Broken Necklace

    P1203 [USACO1.1]坏掉的项链Broken Necklace 题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 ...

  7. BZOJ3075[USACO 2013 Mar Gold 3.Necklace]——AC自动机+DP

    题目描述 给你一个长度为n的字符串A,再给你一个长度为m的字符串B,求至少在A中删去多少个字符才能使得B不是A的子串.注:该题只读入A和B,不读入长度,先读入A,再读入B.数据保证A和B中只含小写字母 ...

  8. P1216 [IOI1994][USACO1.5]数字三角形 Number Triangles(简单dp)

    https://www.luogu.org/problemnew/show/P1216 题目描述 观察下面的数字金字塔. 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大.每一步 ...

  9. 【USACO1.1】Broken Necklace

    题意 一个环形项链,有rbw三种珠子,r代表red,b代表blue,w代表white,从任意一个位置断开,两端分别取珠子,同一端取的珠子要相同颜色,w可以染成想要的颜色,即既可当作r也可以当作b,求最 ...

最新文章

  1. 数据驱动:新药物发现知识图
  2. Lua编译实践1-词法分析:
  3. 题临安邸 【南宋】 林升
  4. deepin--eclipse安装与配置
  5. python自动化办公:邮件篇 (定时邮件问候女票so easy)
  6. solr5.3.1 集成IK中文分词器
  7. 《Ext JS权威指南》——2.4节关于Ext.onReady
  8. android开发自动提示框,Android 多种简单的弹出框样式设置代码
  9. awk 内嵌正则 提取字符串_使用awk提取字符串中的数字或字母
  10. UWP 手绘视频创作工具技术分享系列 - 位图的绘制
  11. (转)MyBatis框架的学习(三)——Dao层开发方法
  12. spring的一些概念及优点
  13. [洛谷P4234]最小差值生成树
  14. nginx 站点使用try_files配置案例
  15. matlab图像加椒盐噪声,用matlab给图像加高斯噪声和椒盐噪声(不调用imnoise函数)...
  16. 蝰蛇音效音效包_用数据科学分析音效迷艺术
  17. PART 1.3 风控利率那些事儿(名义利率 实际利率 还款方式 以及 计算逻辑汇总)
  18. 数据库中update的用法
  19. 计算机硬盘显示offline,LSI芯片Raid卡一块硬盘显示红色Offline(或者Failed)
  20. python正则表达式爬取链家租房信息

热门文章

  1. android 获取存储卡,Android获取存储卡路径的方式
  2. java调用asp.net webapi_通过HttpClient 调用ASP.NET Web API示例
  3. yapi 插件_强大的开源API接口可视化管理平台——YAPI
  4. C~K的班级(II)_JAVA
  5. 面试题整理3 大数的表示及加减法问题
  6. Hough 检测直线
  7. opencv 人脸检测
  8. Java Web -【分页功能】详解
  9. JDK Long源码
  10. (十)装饰器模式详解(与IO不解的情缘)