题目描述

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

  1. 29
  2. wwwbbrwrbrbrrbrbrwrwwrbwrwrrb
输出样例#1:

  1. 11

说明

题目翻译来自NOCOW。

USACO Training Section 1.1

----------------------------------

搜索太没意思了,就开始用DP做死,线性复杂度就可以;

先确定不是全一样

f  :从i开始  d:到i结束

0 :红色   1 :蓝色

找到一个r与b的分界点,从它开始愉快的扫描更新就可以了

因为是环状,自己yy了一个loop标记,反正实现循环了

[PS]:貌似人家爆搜的时间和我差不多,N太小了,唉

  1. //
  2. // main.cpp
  3. // usaco1.1
  4. //
  5. // Created by abc on 16/8/14.
  6. // Copyright © 2016年 abc. All rights reserved.
  7. //
  8.  
  9. #include <iostream>
  10. #include <cstdio>
  11. #include <cmath>
  12. using namespace std;
  13. const int N=;
  14. int n,ans=;
  15. char c[N];
  16. int f[N][],d[N][],only=; //only 0--->all same //0 red 1 blue
  17. inline int nxt(int i){
  18. return (i+)%n;
  19. }
  20. inline int lst(int i){
  21. return (i-+n)%n;
  22. }
  23. void init(){
  24. for(int i=;i<n;i++) if(c[i]=='r') only=;
  25. if(only==) return;
  26. for(int i=;i<n;i++) if(c[i]=='b') only=;
  27. if(only==) return;
  28.  
  29. int st=;
  30. for(int i=;i<n;i++) if(abs(c[i]-c[i-])==) {st=i-;break;}
  31.  
  32. bool loop=;
  33. for(int i=st;loop==||i!=st;i=lst(i)){//printf("for1 %d\n",i);
  34. loop=;
  35. if(c[i]=='r') f[i][]=f[nxt(i)][]+,f[i][]=;
  36. if(c[i]=='b') f[i][]=f[nxt(i)][]+,f[i][]=;
  37. if(c[i]=='w') f[i][]=f[nxt(i)][]+,f[i][]=f[nxt(i)][]+;
  38. }
  39. st++;loop=;
  40. for(int i=st;loop==||i!=st;i=nxt(i)){//printf("for2 %d\n",i);
  41. loop=;
  42. if(c[i]=='r') d[i][]=d[lst(i)][]+,d[i][]=;
  43. if(c[i]=='b') d[i][]=d[lst(i)][]+,d[i][]=;
  44. if(c[i]=='w') d[i][]=d[lst(i)][]+,d[i][]=d[lst(i)][]+;
  45. }
  46.  
  47. }
  48. int main(int argc, const char * argv[]) {
  49. scanf("%d",&n);
  50. for(int i=;i<n;i++) cin>>c[i];
  51.  
  52. init();
  53. if(only==) ans=n;
  54. else for(int i=;i<n;i++){
  55. int t=max(f[i][]+d[lst(i)][],f[i][]+d[lst(i)][]);
  56. ans=max(ans,t);
  57. }
  58. cout<<ans;
  59.  
  60. }

USACO1.1Broken Necklace[环状DP作死]的更多相关文章

  1. [USACO2005][POJ2228]Naptime(对特殊环状DP的处理)

    题目:http://poj.org/problem?id=2228 题意:将一天分为N小时,每小时都有一个价值w,有一头牛要睡觉,而它的睡觉是连续的,且第一小时不能算价值,即如果你睡了[a,b],则你 ...

  2. HDU5730 Shell Necklace(DP + CDQ分治 + FFT)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5730 Description Perhaps the sea‘s definition of ...

  3. HDU 4669 Mutiples on a circle(环状DP)

    题目链接 这是最早看懂题意的一题,状态转移,挺好想..但是比赛时候,就是没有想到怎么去重,而且当时有些情况,也没注意到. 先预处理的dp[0]的情况,就是以p[0]为结尾的情况.之后D就行了,例如样例 ...

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

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

  5. tyvj 1342 教主泡嫦娥 环上DP

    342 教主泡嫦娥 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 2012年12月21日下午3点14分35秒,全世界各国的总统以及领导人都已经汇聚在中国的方 ...

  6. HOJ题目分类

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

  7. bzoj 1023: [SHOI2008]cactus仙人掌图

    这道题是我做的第一道仙人掌DP,小小纪念一下…… 仙人掌DP就是环上的点环状DP,树上的点树上DP.就是说,做一遍DFS,DFS的过程中处理出环,环上的点先不DP,先把这些换上的点的后继点都处理出来, ...

  8. 【BZOJ】3502 PA2012 Tanie linie

    [算法]贪心,一般DP [题解] --- 胡策k≤10的环状DP做法: 1.钦定法:先确定第一位(可能和第n位)的状态,然后后面正常做DP,显然正确答案是一定会被记录的,因为从整体上看不会有影响. 2 ...

  9. [USACO1.1.4]坏掉的项链Broken Necklace

    P1203 [USACO1.1]坏掉的项链Broken Necklace 标签 搜索/枚举 USACO 难度 普及- 题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N&l ...

随机推荐

  1. Window对象

    Window对象:         Window 对象表示浏览器中打开的窗口,如果文档包含框架(frame 或 iframe 标签),浏览器会为 HTML 文档创建一个 window 对象,并为每个框 ...

  2. jquery实现内容滚动

    HTML代码: <div class="scollNews"> <ul> <li><a href="#">1&l ...

  3. Kotlin:Android世界的Swift

    转自:http://www.infoq.com/cn/news/2015/06/Android-JVM-JetBrains-Kotlin Kotlin是一门与Swift类似的静态类型JVM语言,由Je ...

  4. android中Post方式发送HTTP请求

    Post方式比Get方式要复杂一点,因为该方式需要将请求的参数放在http请求的正文中,所以需要构造请求体. 步骤: 1.构造URL URL url = new URL(PATH); 2.设置连接 H ...

  5. 【代码笔记】iOS-截屏功能

    代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. // ...

  6. ARC下内存泄露问题

    ARC下内存泄露问题 ARC下内存泄露问题,有需要的朋友可以参考下. iOS提供了ARC功能,很大程度上简化了内存管理的代码. 但使用ARC并不代表了不会发生内存泄露,使用不当照样会发生内存泄露. 下 ...

  7. LCS(Longest Common Subsequence 最长公共子序列)

    最长公共子序列 英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已 ...

  8. 跨域iframe的高度自适应

    If you cannot hear the sound of the genuine in you, you will all of your life spend your days on the ...

  9. 【转】C# 中的委托和事件

    阅读目录 C# 中的委托和事件 引言 将方法作为方法的参数 将方法绑定到委托 事件的由来 事件和委托的编译代码 委托.事件与Observer设计模式 .Net Framework中的委托与事件 总结 ...

  10. SQL 扩展事件

    在本篇,我通过使用新建“Session ”对话框来创建新的扩展事件会话.定义一个自己的扩展事件,动作和谓词,并且发布一个以收集事件数据为目的的会话. 首先从UI开始 在SQLServer2008R2以 ...