【洛谷】P1203 [USACO1.1]坏掉的项链Broken Necklace
1. 前言
- 这是一道经典的dp题,时限:20min
- 环形dp通常转换成两个字符串拼接在一起从而覆盖住所有情况。
- 使用两次dp,分别求解分割点左侧和右侧的最大值。这种dp下再分左右区间的问题也有很多。
- 注意边界条件
- 文章来源:CSDN@LawsonAbs
2. 题目
2.1 题目链接
2.2 题意
给出一串由r,b,w
字符组成的环形字符串,问如何从环中切割,拉直后,从左端和从右端分别找出最长的相同字符长度。其中w
既可以做r
字符,也可以代替b
字符。
输入:一串字符
输出:可以收集到的最多的珠子数目(左右侧珠子数之和)
下面以字符串 “wrwrrb” 举例说明:
3. 分析
刷过题的都知道这是一道明眼的dp题。但是有个问题还是得问自己:dp数组该如何定义?
- 定义
dpl[i] ,dpr[i]
表示在第i个单词前分开,从左向右 和 从右向左可以划分得到的最大长度,然后最后取和求最大即可。i从0开始。有一个地方需要注意:dpl[i]
和dpr[i]
都必须同时保持在单词前,或者同时在单词后分割。 我们这里选择在单词前分割,举个例子:
012345
wrwrrb
当i=5
时,分界情况就是:wrwrr[SEP]b
,dpl[i]
的计算就是bwrwrr中的bw,长度为2(从分界点往右);dpr[5]的长度就是rrwrwb
为5(分界点往左);
- 因为像统一处理环形,所以我们将两个字符串拼接在一起。【其实如果不想拼接,应该可以用取模达到同样的效果】字符串拼接之后,最大的数组长度也需要改变为2*maxN。
4. 代码
代码无非就是这些分界点比较难搞,如果这些搞清楚之后,就很好的写代码了。
#include<iostream>
#include<string>using namespace std;
const int maxN = 400;int main(){int dpl[maxN],dpr[maxN];int n ;string str;//cin >> n ;cin >> str;str += str; // 两份拼凑//初始化都为1 fill(dpl,dpl+maxN,1);fill(dpr,dpr+maxN,1);char cur_color;int len = str.length(); //dpl[i]表示从第i个节点前分开 for (int i = 0;i< len-1;i++){cur_color = str[i];for(int j = i+1;j<len;j++){if(cur_color == str[j] || str[j] == 'w'){dpl[i]++; }else if(cur_color == 'w' && str[j]!='w'){cur_color = str[j] ; //修改当前色 dpl[i]++;} else //跳出循环,结束 break; }}//从右往左 dpr[i] 必须包括自己 ,dpr[i]表示从第i个节点前分开 for (int i = len-1;i >=1 ;i--){cur_color = str[i-1]; for(int j = i-2;j>=0;j--){ if(cur_color == str[j] || str[j] == 'w' ){dpr[i]++; }else if(cur_color == 'w' && str[j]!='w'){cur_color = str[j] ; //修改当前色 dpr[i]++; } else //跳出循环,结束 break; }}int res = 0;for (int i = 0;i< len;i++){//cout <<"i="<<i<<" "<< dpl[i] <<" "<< dpr[i]<<"\n";res = max(dpl[i]+dpr[i],res);}//需要注意最长不过原始str 本身的长度 cout << min(res,len/2) ;
}
测试用例
1
b 3
rrr5
wrwrr29
brbrrrbbbrrrrrbrrbbrbbbbrrrrb29
wwwbbrwrbrbrrbrbrwrwwrbwrwrrb
【洛谷】P1203 [USACO1.1]坏掉的项链Broken Necklace相关推荐
- 洛谷 P1203 [USACO1.1]坏掉的项链Broken Necklace
P1203 [USACO1.1]坏掉的项链Broken Necklace 题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 ...
- 洛谷 P1203 [USACO1.1]坏掉的项链Broken Necklace 动态规划
题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A ...
- 洛谷 1203 [USACO1.1]坏掉的项链Broken Necklace
题目: https://www.luogu.org/problem/show?pid=1203 标签是搜索和动态规划--: O(n^2)纯模拟; 这个题交了三遍才A: 思路: 记两个数组:Next和p ...
- P1203 [USACO1.1]坏掉的项链Broken Necklace
题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A ...
- AC日记——[USACO1.1]坏掉的项链Broken Necklace 洛谷 P1203
题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A ...
- [USACO1.1]坏掉的项链Broken Necklace
题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A ...
- USACO Training Section 1.1 坏掉的项链Broken Necklace
题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A ...
- 坏掉的项链Broken Necklace
题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A ...
- usaco1.1坏掉的项链
题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A ...
最新文章
- 从零开始学习docker(一)
- 线程中这么调用类_一文学会 Python 多线程编程
- ARM DS-5 Flex网络许可证编译错误“Error: C9933W: Waiting for license...”
- 校园网锐捷Ubuntu12.04LTS
- 单片机跑马灯代码示例
- 灵格斯词典(电脑端)+欧陆词典(手机端)
- unit怎么发音_“unit”怎么读?
- 基于RiskPariyBlackLitterman的因子择时
- SIRIUS更新日志|SIRIUS人脸识别更新日志|天狼星人脸识别更新日志
- 中式红木装修,古雅灵动、温婉雅致、独具风情
- 钉钉isv应用开发(钉钉isv应用开发注意事项)
- 大盘点!进口+国产28款分子POCT设备分析
- 博客登录注册界面的实现
- 新茶饮、新烘焙的2021:亏损与食安问题未解,元宇宙和第三空间又来凑热闹
- STC89C52单片机实验 DAY1 LED模块
- 微信中网页分享开发遇到的坑
- 安装Office2010/2007出现1935错误解决办法
- 零基础,自学JAVA编程需要多长时间才能学完?
- [003]python数据类型一__python_全栈基础
- 【OA办公】OA流程审批大揭秘,带你看遍所有基础流程
热门文章
- 网络爬虫笔记—滑动验证码识别
- Chrome 的书签太多如何分类整理比较好
- sleuth+zipkin链路追踪
- 银行网络安全现状及要求措施建议
- python的网络请求库urllib、urllib2、urllib3、request的联系
- Linux服务器安装配置Redis
- Python智慧农业之将数据存储在表格中并从图表中获取见解,基于 Google 表格和 Neo4j 中维护伴随植物知识图谱(教程含源码)
- utf8改成utf8mb4实战教程
- gz是什么意思饭圈_电竞最后的排面,UZI被抬上年度第一,饭圈女孩:放过我们吧哥哥...
- 200条装修小常识①