九度OJ 1260:珍珠项链 (字符串处理、DP)

2024-04-02 02:08

本文主要是介绍九度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 100000void 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;elsea[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: 1260User: liangrx06Language: CResult: AcceptedTime:210 msMemory:2896 kb
****************************************************************/


这篇关于九度OJ 1260:珍珠项链 (字符串处理、DP)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/868703

相关文章

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

Python处理大量Excel文件的十个技巧分享

《Python处理大量Excel文件的十个技巧分享》每天被大量Excel文件折磨的你看过来!这是一份Python程序员整理的实用技巧,不说废话,直接上干货,文章通过代码示例讲解的非常详细,需要的朋友可... 目录一、批量读取多个Excel文件二、选择性读取工作表和列三、自动调整格式和样式四、智能数据清洗五、

golang float和科学计数法转字符串的实现方式

《golangfloat和科学计数法转字符串的实现方式》:本文主要介绍golangfloat和科学计数法转字符串的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望... 目录golang float和科学计数法转字符串需要对float转字符串做处理总结golang float

Python如何判断字符串中是否包含特殊字符并替换

《Python如何判断字符串中是否包含特殊字符并替换》这篇文章主要为大家详细介绍了如何使用Python实现判断字符串中是否包含特殊字符并使用空字符串替换掉,文中的示例代码讲解详细,感兴趣的小伙伴可以了... 目录python判断字符串中是否包含特殊字符方法一:使用正则表达式方法二:手动检查特定字符Pytho

SpringBoot如何对密码等敏感信息进行脱敏处理

《SpringBoot如何对密码等敏感信息进行脱敏处理》这篇文章主要为大家详细介绍了SpringBoot对密码等敏感信息进行脱敏处理的几个常用方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录​1. 配置文件敏感信息脱敏​​2. 日志脱敏​​3. API响应脱敏​​4. 其他注意事项​​总结

Python使用python-docx实现自动化处理Word文档

《Python使用python-docx实现自动化处理Word文档》这篇文章主要为大家展示了Python如何通过代码实现段落样式复制,HTML表格转Word表格以及动态生成可定制化模板的功能,感兴趣的... 目录一、引言二、核心功能模块解析1. 段落样式与图片复制2. html表格转Word表格3. 模板生

Python Pandas高效处理Excel数据完整指南

《PythonPandas高效处理Excel数据完整指南》在数据驱动的时代,Excel仍是大量企业存储核心数据的工具,Python的Pandas库凭借其向量化计算、内存优化和丰富的数据处理接口,成为... 目录一、环境搭建与数据读取1.1 基础环境配置1.2 数据高效载入技巧二、数据清洗核心战术2.1 缺失

SpringBoot项目中Redis存储Session对象序列化处理

《SpringBoot项目中Redis存储Session对象序列化处理》在SpringBoot项目中使用Redis存储Session时,对象的序列化和反序列化是关键步骤,下面我们就来讲讲如何在Spri... 目录一、为什么需要序列化处理二、Spring Boot 集成 Redis 存储 Session2.1

MySQL 字符串截取函数及用法详解

《MySQL字符串截取函数及用法详解》在MySQL中,字符串截取是常见的操作,主要用于从字符串中提取特定部分,MySQL提供了多种函数来实现这一功能,包括LEFT()、RIGHT()、SUBST... 目录mysql 字符串截取函数详解RIGHT(str, length):从右侧截取指定长度的字符SUBST

Python将字符串转换为小写字母的几种常用方法

《Python将字符串转换为小写字母的几种常用方法》:本文主要介绍Python中将字符串大写字母转小写的四种方法:lower()方法简洁高效,手动ASCII转换灵活可控,str.translate... 目录一、使用内置方法 lower()(最简单)二、手动遍历 + ASCII 码转换三、使用 str.tr