九度OJ 1260:珍珠项链 (字符串处理、DP)
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:101
解决:27
- 题目描述:
-
假设有一条珍珠项链,有很多珍珠,r代表红色, b代表蓝色, w代表白色。
假设你在某一处剪开之后,你会沿着顺时针和逆时针方向收集珠子,但是收集珠子有一个条件:
1.只能收集同一种颜色的珠子 2.w可以表示红色也可以表示蓝色。
你怎么剪才能收集到尽可能多的珠子。
例如下图中,在2、3之间剪开,逆时针方向可以收集到3颗珠子(r),顺时针方向能收集到3颗珠子(b),这样2、3之间剪开能收集6颗
12
rr
10 w w 3
9 b b 4
8 w w 5
rr
76
- 输入:
-
输入包含一个仅有'r','w','b'三个字符的字符串。
- 输出:
-
可能有多组测试数据,对于每组数据,
输出最多可以收集多少颗珍珠。
- 样例输入:
-
rrwbwrrwbw
- 样例输出:
-
6
思路:
此题相较于一般的DP,麻烦之处是字符串构成一个圆。因此不是从1到n的DP,而是从第1个n到第n个n的递归。
代码比较晦涩,只因我一时手贱非要写成两个方向统一的函数代码。
代码:
#include <stdio.h>
#include <string.h> #define N 100000 void count(int c[N][2], int a[N], int n, int begin, int towards)
{
int i = begin;
while (i != begin + n*towards && a[(i+n)%n] == 2)
i += towards;
//printf("begin=%d, i=%d, towards=%d\n", begin, i, towards);
c[begin][0] = c[begin][1] = (i - begin)*towards;
if (i != begin + n*towards)
{
int color = a[(i+n)%n];
i += towards;
while (i != begin + n*towards && a[(i+n)%n] != 1-color)
i += towards;
c[begin][color] = (i - begin)*towards;
}
} void dp(int c[N][2], int a[N], int n, int i, int j)
{
int color = a[i];
if (color == 2)
{
c[i][0] = (c[j][0] < n) ? (c[j][0] + 1) : n;
c[i][1] = (c[j][1] < n) ? (c[j][1] + 1) : n;
}
else
{
c[i][color] = c[j][color] + 1;
c[i][1-color] = 0;
}
} int Max(int x, int y)
{
return (x > y) ? x : y;
} int main(void)
{
int n, i, j, k;
char s[N+1];
int a[N];
int c[2][N][2]; while (scanf("%s", s) != EOF)
{
n = strlen(s);
for (i=0; i<n; i++)
{
if (s[i] == 'r')
a[i] = 0;
else if (s[i] == 'b')
a[i] = 1;
else
a[i] = 2;
//printf("%d", a[i]);
}
//printf("\n"); for (k=0; k<2; k++)
{
int towards = k*2 - 1;
count(c[k], a, n, 0, towards);
//printf("c[%d][%d]=%d,%d\n", k, 0, c[k][0][0], c[k][0][1]);
for (i=-towards; i!=-(n*towards); i-=towards)
{
j = (i+towards+n)%n;
int ii = (i+n)%n;
dp(c[k], a, n, ii, j);
//printf("c[%d][%d]=%d,%d\n", k, ii, c[k][ii][0], c[k][ii][1]);
}
} int max = 0;
for (i=0; i<n; i++)
{
int t1 = Max(c[0][i][0], c[0][i][1]);
j = (i+1)%n;
int t2 = Max(c[1][j][0], c[1][j][1]);
max = (t1+t2 > max) ? t1+t2 : max;
if (max >= n)
{
max = n;
break;
}
}
printf("%d\n", max);
} return 0;
}
/**************************************************************
Problem: 1260
User: liangrx06
Language: C
Result: Accepted
Time:210 ms
Memory:2896 kb
****************************************************************/
九度OJ 1260:珍珠项链 (字符串处理、DP)的更多相关文章
- 九度OJ 1206:字符串连接 (字符串操作)
时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:4127 解决:1957 题目描述: 不借用任何字符串库函数实现无冗余地接受两个字符串,然后把它们无冗余的连接起来. 输入: 每一行包括两个 ...
- 九度OJ 1168:字符串的查找删除 (查找)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4276 解决:1699 题目描述: 给定一个短字符串(不含空格),再给定若干字符串,在这些字符串中删除所含有的短字符串. 输入: 输入只有1 ...
- 九度OJ 1082:代理服务器 (DP)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1871 解决:574 题目描述: 使用代理服务器能够在一定程度上隐藏客户端信息,从而保护用户在互联网上的隐私.我们知道n个代理服务器的IP地 ...
- 九度OJ 1066:字符串排序 (排序)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5632 解决:2299 题目描述: 输入一个长度不超过20的字符串,对所输入的字符串,按照ASCII码的大小从小到大进行排序,请输出排序后的 ...
- 九度OJ 1054:字符串内排序 (排序)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:7949 解决:4343 题目描述: 输入一个字符串,长度小于等于200,然后将输出按字符顺序升序排序后的字符串. 输入: 测试数据有多组,输 ...
- 九度OJ 1049:字符串去特定字符 (基础题)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:8499 解决:3860 题目描述: 输入字符串s和字符c,要求去掉s中所有的c字符,并输出结果. 输入: 测试数据有多组,每组输入字符串s和 ...
- 九度OJ 1135:字符串排序 (排序)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1559 解决:807 题目描述: 先输入你要输入的字符串的个数.然后换行输入该组字符串.每个字符串以回车结束,每个字符串少于一百个字符. 如 ...
- 九度OJ 1105:字符串的反码 (翻译)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4929 解决:1529 题目描述: 一个二进制数,将其每一位取反,称之为这个数的反码.下面我们定义一个字符的反码.如果这是一个小写字符,则它 ...
- 九度OJ 1091:棋盘游戏 (DP、BFS、DFS、剪枝)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1497 解决:406 题目描述: 有一个6*6的棋盘,每个棋盘上都有一个数值,现在又一个起始位置和终止位置,请找出一个从起始位置到终止位置代 ...
随机推荐
- linux bash 入门
#!/bin/bash #shell使用的熟练成都反映用户对Unix/Linux使用的熟练程度 #shell 有两种执行命令的方式:交互式和批处理 #常见的shell脚本解释器有bash,sh,csh ...
- sersync+rsync实时数据同步
sersync+rsync实时数据同步 1.相关背景介绍 前面有关文章配置实现了rsync增量同步以及配置为定时同步,但是在实际生产环境中需要实时的监控数据从而进行同步(不间断同步),可以采取inot ...
- 【共享单车】—— React后台管理系统开发手记:权限设置和菜单调整(未完)
前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...
- Python从2.7.5升级到3.6.5
Python从2.7.5升级到3.6.5学习了:https://blog.csdn.net/liang19890820/article/details/51079633 wget https://ww ...
- django model filter 条件过滤,及多表连接查询、反向查询,某字段的distinct
1.多表连接查询:当我知道这点的时候顿时觉得django太NX了. class A(models.Model): name = models.CharField(u'名称') class B ...
- webcat——基于netty的http和websocket框架
代码地址如下:http://www.demodashi.com/demo/12687.html Webcat是一个基于netty的简单.高性能服务端框架,目前提供http和websocket两种协议的 ...
- HTTP协议图解
1.HTTP简介 http是用于客户端与服务端之间的通信 实际情况中客户端与服务端角色有可能互换,但从一条通信线路来说服务器端和客户端角色是确定的,http协议知道那个是服务端那个是客户端呢. htt ...
- 解决:cant't run '/etc/init.d/rcS':No such file or directory
Linux内核启动时提示这种错误:cant't run '/etc/init.d/rcS':No such file or directory 请用vim打开文件:/etc/init.d/rcS 观察 ...
- javascript 温故而知新 getBoundingClientRect
getBoundingClientRect获取元素位置 getBoundingClientRect用于获得页面中某个元素的左,上,右和下分别相对浏览器视窗的位置. getBoundingClient ...
- Unity多个场景叠加或大场景处理方法小结
本文章由cartzhang编写.转载请注明出处. 全部权利保留. 文章链接: http://blog.csdn.net/cartzhang/article/details/47614153 作者:ca ...