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=;
- int n,ans=;
- char c[N];
- int f[N][],d[N][],only=; //only 0--->all same //0 red 1 blue
- inline int nxt(int i){
- return (i+)%n;
- }
- inline int lst(int i){
- return (i-+n)%n;
- }
- void init(){
- for(int i=;i<n;i++) if(c[i]=='r') only=;
- if(only==) return;
- for(int i=;i<n;i++) if(c[i]=='b') only=;
- if(only==) return;
- int st=;
- for(int i=;i<n;i++) if(abs(c[i]-c[i-])==) {st=i-;break;}
- bool loop=;
- for(int i=st;loop==||i!=st;i=lst(i)){//printf("for1 %d\n",i);
- loop=;
- if(c[i]=='r') f[i][]=f[nxt(i)][]+,f[i][]=;
- if(c[i]=='b') f[i][]=f[nxt(i)][]+,f[i][]=;
- if(c[i]=='w') f[i][]=f[nxt(i)][]+,f[i][]=f[nxt(i)][]+;
- }
- st++;loop=;
- for(int i=st;loop==||i!=st;i=nxt(i)){//printf("for2 %d\n",i);
- loop=;
- if(c[i]=='r') d[i][]=d[lst(i)][]+,d[i][]=;
- if(c[i]=='b') d[i][]=d[lst(i)][]+,d[i][]=;
- if(c[i]=='w') d[i][]=d[lst(i)][]+,d[i][]=d[lst(i)][]+;
- }
- }
- int main(int argc, const char * argv[]) {
- scanf("%d",&n);
- for(int i=;i<n;i++) cin>>c[i];
- init();
- if(only==) ans=n;
- else for(int i=;i<n;i++){
- int t=max(f[i][]+d[lst(i)][],f[i][]+d[lst(i)][]);
- ans=max(ans,t);
- }
- cout<<ans;
- }
USACO1.1Broken Necklace[环状DP作死]的更多相关文章
- [USACO2005][POJ2228]Naptime(对特殊环状DP的处理)
题目:http://poj.org/problem?id=2228 题意:将一天分为N小时,每小时都有一个价值w,有一头牛要睡觉,而它的睡觉是连续的,且第一小时不能算价值,即如果你睡了[a,b],则你 ...
- HDU5730 Shell Necklace(DP + CDQ分治 + FFT)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5730 Description Perhaps the sea‘s definition of ...
- HDU 4669 Mutiples on a circle(环状DP)
题目链接 这是最早看懂题意的一题,状态转移,挺好想..但是比赛时候,就是没有想到怎么去重,而且当时有些情况,也没注意到. 先预处理的dp[0]的情况,就是以p[0]为结尾的情况.之后D就行了,例如样例 ...
- TYVJ P1062 合并傻子 Label:环状dp
背景 从前有一堆傻子,钟某人要合并他们~但是,合并傻子是要掉RP的...... 描述 在一个园形操场的四周站着N个傻子,现要将傻子有次序地合并成一堆.规定每次只能选相邻的2个傻子合并成新的一个傻子,并 ...
- tyvj 1342 教主泡嫦娥 环上DP
342 教主泡嫦娥 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 2012年12月21日下午3点14分35秒,全世界各国的总统以及领导人都已经汇聚在中国的方 ...
- HOJ题目分类
各种杂题,水题,模拟,包括简单数论. 1001 A+B 1002 A+B+C 1009 Fat Cat 1010 The Angle 1011 Unix ls 1012 Decoding Task 1 ...
- bzoj 1023: [SHOI2008]cactus仙人掌图
这道题是我做的第一道仙人掌DP,小小纪念一下…… 仙人掌DP就是环上的点环状DP,树上的点树上DP.就是说,做一遍DFS,DFS的过程中处理出环,环上的点先不DP,先把这些换上的点的后继点都处理出来, ...
- 【BZOJ】3502 PA2012 Tanie linie
[算法]贪心,一般DP [题解] --- 胡策k≤10的环状DP做法: 1.钦定法:先确定第一位(可能和第n位)的状态,然后后面正常做DP,显然正确答案是一定会被记录的,因为从整体上看不会有影响. 2 ...
- [USACO1.1.4]坏掉的项链Broken Necklace
P1203 [USACO1.1]坏掉的项链Broken Necklace 标签 搜索/枚举 USACO 难度 普及- 题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N&l ...
随机推荐
- Window对象
Window对象: Window 对象表示浏览器中打开的窗口,如果文档包含框架(frame 或 iframe 标签),浏览器会为 HTML 文档创建一个 window 对象,并为每个框 ...
- jquery实现内容滚动
HTML代码: <div class="scollNews"> <ul> <li><a href="#">1&l ...
- Kotlin:Android世界的Swift
转自:http://www.infoq.com/cn/news/2015/06/Android-JVM-JetBrains-Kotlin Kotlin是一门与Swift类似的静态类型JVM语言,由Je ...
- android中Post方式发送HTTP请求
Post方式比Get方式要复杂一点,因为该方式需要将请求的参数放在http请求的正文中,所以需要构造请求体. 步骤: 1.构造URL URL url = new URL(PATH); 2.设置连接 H ...
- 【代码笔记】iOS-截屏功能
代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. // ...
- ARC下内存泄露问题
ARC下内存泄露问题 ARC下内存泄露问题,有需要的朋友可以参考下. iOS提供了ARC功能,很大程度上简化了内存管理的代码. 但使用ARC并不代表了不会发生内存泄露,使用不当照样会发生内存泄露. 下 ...
- LCS(Longest Common Subsequence 最长公共子序列)
最长公共子序列 英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已 ...
- 跨域iframe的高度自适应
If you cannot hear the sound of the genuine in you, you will all of your life spend your days on the ...
- 【转】C# 中的委托和事件
阅读目录 C# 中的委托和事件 引言 将方法作为方法的参数 将方法绑定到委托 事件的由来 事件和委托的编译代码 委托.事件与Observer设计模式 .Net Framework中的委托与事件 总结 ...
- SQL 扩展事件
在本篇,我通过使用新建“Session ”对话框来创建新的扩展事件会话.定义一个自己的扩展事件,动作和谓词,并且发布一个以收集事件数据为目的的会话. 首先从UI开始 在SQLServer2008R2以 ...