九度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的棋盘,每个棋盘上都有一个数值,现在又一个起始位置和终止位置,请找出一个从起始位置到终止位置代 ...
随机推荐
- ASP.NET MVC学习---(六)CRUD例子补充
在之前,我们使用mvc做了一个crud的小例子 整个项目过程应该是能够很容易理解的 通过这个例子我们可以大概的了解mvc的基本使用方法 但是由于篇幅限制(还不如说自己懒不想写那么长...) 没有能够在 ...
- Android 比ListView更好用强大的RecyclerView库:RecyclerViewLibrary
RecyclerViewLibrary A RecyclerView libirary ,has some support, like headerAdapter/TreeAdapter,and Pu ...
- javascript 回车实现 tab 切换功能完美解决
最经有一个项目是给化工厂做的在使用的过程中需要输入大量的数据,使用的都是小键盘区,在以前都是通过excel录入数据的现在, 在网页上需要实现excel 那样的回车换行的功能在网上找了有关这方面的问题但 ...
- Microsoft Sync Framework 2.1 可再发行程序包 Microsoft Sync Framework 1.0 SP1 - 中文(简体)
Sync Framework 2.1 引入了新功能,这些功能支持您计算机上的 SQL Server 或 SQL Server Compact 数据库与 SQL Azure 数据库进行同步.此发行版还引 ...
- 使用Junit4对web项目进行测试(一)Junit初配置
Junit测试用例不是用来证明你是对的,而是用来证明你没有错 1.功能 -在项目未在浏览器运行之前对获得的结果和预期的结果进行比较调试,减少BUG和发布时的修复工作 2.测试类和代码类应分开存放. ...
- SpringMVC处理MySQL BLOB字段的下载
任务: uos.docfile的content字段是longblob类型,通过Web点击链接能下载到存储在这个字段里的文件.Web点击链接类似如下形式: http://localhost:8080/d ...
- 【BIEE】页面跳转以及跳转后返回
报表开发过程中,我们经常会遇到这种问题:知道统计结果,然后根据统计结果去看明细数据 很多人可能首先想到的就是钻探,钻探是一种方法,但是不是唯一的办法,可以使用页面跳转完成. 下面举个例子 页面A 现在 ...
- myBatis插入oracle获取主键
<insert id="insert" parameterType="com.inspur.biz.entry.SpLackApply"> < ...
- Jmeter3.0-插件管理
本文转自推酷:http://www.tuicool.com/articles/UV7fI3V JMeter ,老牌,开源,轻量,Apache基金会的顶级项目,光是这些关键字就足以让大量用户将其纳入自己 ...
- jmeter压测-负载配置
jmeter 压测 一般压测的时间是10-15分钟 TPS:服务端每秒钟处理的请求数 越大越好 响应时间 :越短越好 并发用户数 也就是多少并发 指标给你:tps要达到多少 响应时间要达到多少 并 ...