时间限制: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)的更多相关文章

  1. 九度OJ 1206:字符串连接 (字符串操作)

    时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:4127 解决:1957 题目描述: 不借用任何字符串库函数实现无冗余地接受两个字符串,然后把它们无冗余的连接起来. 输入: 每一行包括两个 ...

  2. 九度OJ 1168:字符串的查找删除 (查找)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4276 解决:1699 题目描述: 给定一个短字符串(不含空格),再给定若干字符串,在这些字符串中删除所含有的短字符串. 输入: 输入只有1 ...

  3. 九度OJ 1082:代理服务器 (DP)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1871 解决:574 题目描述: 使用代理服务器能够在一定程度上隐藏客户端信息,从而保护用户在互联网上的隐私.我们知道n个代理服务器的IP地 ...

  4. 九度OJ 1066:字符串排序 (排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5632 解决:2299 题目描述: 输入一个长度不超过20的字符串,对所输入的字符串,按照ASCII码的大小从小到大进行排序,请输出排序后的 ...

  5. 九度OJ 1054:字符串内排序 (排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:7949 解决:4343 题目描述: 输入一个字符串,长度小于等于200,然后将输出按字符顺序升序排序后的字符串. 输入: 测试数据有多组,输 ...

  6. 九度OJ 1049:字符串去特定字符 (基础题)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:8499 解决:3860 题目描述: 输入字符串s和字符c,要求去掉s中所有的c字符,并输出结果. 输入: 测试数据有多组,每组输入字符串s和 ...

  7. 九度OJ 1135:字符串排序 (排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1559 解决:807 题目描述: 先输入你要输入的字符串的个数.然后换行输入该组字符串.每个字符串以回车结束,每个字符串少于一百个字符. 如 ...

  8. 九度OJ 1105:字符串的反码 (翻译)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4929 解决:1529 题目描述: 一个二进制数,将其每一位取反,称之为这个数的反码.下面我们定义一个字符的反码.如果这是一个小写字符,则它 ...

  9. 九度OJ 1091:棋盘游戏 (DP、BFS、DFS、剪枝)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1497 解决:406 题目描述: 有一个6*6的棋盘,每个棋盘上都有一个数值,现在又一个起始位置和终止位置,请找出一个从起始位置到终止位置代 ...

随机推荐

  1. ElasticSearch 安装中文分词器

    1.安装中文分词器IK 下载地址:https://github.com/medcl/elasticsearch-analysis-ik 在线下载安装: elasticsearch-plugin.bat ...

  2. 机器学习第4课:多变量线性回归(Linear Regression with Multiple Variables)

    4.1  多维特征 目前为止,我们探讨了单变量/特征的回归模型,现在我们对房价模型增加更多的特征, 例如房间数楼层等,构成一个含有多个变量的模型,模型中的特征为(x1,x2,...,xn).

  3. 【Hadoop】YARN 原理、MR本地&YARN运行模式

    1.基本概念 2.YARN.MR交互流程 3.源码解读

  4. 为集群配置Impala和Mapreduce

    FROM: http://www.importnew.com/5881.html -- 扫描加关注,微信号: importnew -- 原文链接: Cloudera 翻译: ImportNew.com ...

  5. 用反射来了解Java中泛型的本质

    这篇文章主要通过Class的Method来了解泛型的本质. 先new 两个List,一个不加类型限制,另外一个限制类型为String: ArrayList list = new ArrayList() ...

  6. Ubuntu使用日志2(在Eclipse中搭建C++交叉编译环境)

    Release用交叉编译:arm-none-linux-gnueabi-gcc. 搭建步骤: 1).在Project->Properties->C/C++ Build->Settin ...

  7. HTML5 Canvas 动态勾画等速螺线

    等速螺线亦称阿基米德螺线,得名于公元前三世纪希腊数学家阿基米德.阿基米德螺线是一个点匀速离开一个固定点的同时又以固定的角速度绕该固定点转动而产生的轨迹.在此向这位古代最伟大的数学家致敬.用Canvus ...

  8. MPTCP 源码分析(一) MPTCP的三次握手

    简述:      MPTCP依然按照正常的TCP进行三次握手,只是在握手过程中增加了MPTCP特有的信息.   建立过程      三次握手过程如下图所示: 左边客户端发送的第一个SYN包携带有客户端 ...

  9. badblocks检测磁盘坏道

    1.检测整个盘如/dev/sdb #badblocks -v /dev/sdb > badsectors.txt 2.检测一个分区#badblocks -v /dev/sdb1 > bad ...

  10. android 通过bitmapfactory得到图片真实像素的方法,以及没有得到真实像素的原因

    原文来自:原文地址 由于这个错误导致浪费非常长时间找原因,所以要赶紧记录下来. 过程是这种,在使用android读取图片的时候,就是使用BitmapFactory.decodeResource(thi ...