P4158 [SCOI2009]粉刷匠(洛谷)
今天A了个紫(我膨胀了),他看起来像个贪心一样,老师说我写的是dp(dp理解不深的缘故QWQ)
直接放题目描述(我旁边有个家伙让我放链接,我还是说明出处吧(万一出处没有了)我讲的大多数题目都是出自洛谷,大佬们有兴趣可以去水一下。
题目描述
windy有 N 条木板需要被粉刷。 每条木板被分为 M 个格子。 每个格子要被刷成红色或蓝色。 windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色。 每个格子最多只能被粉刷一次。 如果windy只能粉刷 T 次,他最多能正确粉刷多少格子? 一个格子如果未被粉刷或者被粉刷错颜色,就算错误粉刷。 输入格式
第一行包含三个整数,N M T。 接下来有N行,每行一个长度为M的字符串,'0'表示红色,'1'表示蓝色。 输出格式
包含一个整数,最多能正确粉刷的格子数。 输入输出样例
输入 #1复制
3 6 3
111111
000000
001100
输出 #1复制
16
说明/提示
30%的数据,满足 1 <= N,M <= 10 ; 0 <= T <= 100 。 100%的数据,满足 1 <= N,M <= 50 ; 0 <= T <= 2500 。
这个题看起来是个贪心的样子呢,我们来水一下吧。
有个大佬说过:dp不会加一维。
因为空间够,所以我开了4维数组(空间竟然没爆)。a[i][j][k][0/1]的4个维度分别是现在的位置是(i,j),k是现在的步数,第4维有2种:0是涂色错误,1是涂色正确。a[i][j][k][0/1]的值是到达这种情况的最大值。(看着没毛病,妥妥的暴力)
首先这个题有3种情况。
1:现在的状态处于一块木板的开头。
2:现在的字符和上一个字符相符。
3:现在的字符和上一个字符不符。
如果1是成立的,那2,3就可以不管了。
现在把这道题分成3部分来做。
首先是第2部分(第2部分很简单的)
a[i][j][k][0]=a[i][j-1][k][0];
a[i][j][k][1]=a[i][j-1][k][1]+1;
有的同学可能有个疑问,为什么第二句不是下方代码呢?
a[i][j][k][1]=max(a[i][j-1][k][1],a[i][j-1][k-1][0])+1;
我来解释一下,第二种情况是他和前一个相符的,竟然这样,那直接从最前面刚开始不同的地方更改不是更香吗?(真香)
(我相信不会有哪个人把正确的颜色改成错误的,所以这个情况就结束了……)
所以现在我们就把第二种情况解决了(真草率)。开始处理第3种情况(第一种留到最后吧)。
a[i][j][k][0]=a[i][j-1][k][1];
a[i][j][k][1]=max(a[i][j-1][k][0],a[i][j-1][k-1][1])+1;
第一句的解释和上一个同理,我相信同学们不会把一个正确的颜色改成错误的。
但第二句就有2种可能性了,就像样例最后一行一样,全涂成红色反而最多,所以他要从保持上个颜色和换成正确的颜色之间选最大的一个。
然后就是第一种了,第一种就是继承上一行的最大可能性
a[i][j][k][0]=max(a[i-1][m][k-1][0],a[i-1][m][k-1][1]);
a[i][j][k][1]=max(a[i-1][m][k-1][0],a[i-1][m][k-1][1])+1;
最大的地方就是上一行的最后一个了。可能他涂错颜色,总数大,也可能他涂对颜色,总数大。于是max一波(这个样例帮了我们大忙)
还有一个要注意的地方,截取最大值要从中间截取,至于为什么,你们可以把样例里的t换成2试试。(他最大能涂对12个,根本不用涂最后一块,照我这个写法就会错)。
好了,大家自己去试试吧。
感谢收看,感谢这个紫题,这是我第一个通过的紫题,我会记住这一天的(过几天就忘了)。
P4158 [SCOI2009]粉刷匠(洛谷)的更多相关文章
- Luogu P4158 [SCOI2009]粉刷匠(dp+背包)
P4158 [SCOI2009]粉刷匠 题意 题目描述 \(windy\)有\(N\)条木板需要被粉刷.每条木板被分为\(M\)个格子. 每个格子要被刷成红色或蓝色. \(windy\)每次粉刷,只能 ...
- 【题解】洛谷P4158 [SCOI2009] 粉刷匠(DP)
次元传送门:洛谷P4158 思路 f[i][j][k][0/1]表示在坐标为(i,j)的格子 已经涂了k次 (0是此格子涂错 1是此格子涂对)涂对的格子数 显然的是 每次换行都要增加一次次数 那么当j ...
- 洛谷P4158 [SCOI2009]粉刷匠
传送门 设$dp[i][j][k][0/1]$表示在涂点$(i,j)$,涂了$k$次,当前点的颜色是否对,最多能刷对多少个格子 首先换行的时候肯定得多刷一次 然后是如果和前一个格子颜色相同,那么当前点 ...
- 洛谷 P4158 [SCOI2009]粉刷匠 题解
每日一题 day59 打卡 Analysis 很容易看出是一个dp, dp[i][j[k][0/1]来表示到了(i,j)时,刷了k次,0表示这个没刷,1表示刷了. 于是有转移: 1.换行时一定要重新刷 ...
- P4158[SCOI2009]粉刷匠
题目描述 windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色. 每个格子最多只能被 ...
- 背包 DP【洛谷P4158】 [SCOI2009]粉刷匠
P4158 [SCOI2009]粉刷匠 windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上 ...
- 【BZOJ1296】[SCOI2009]粉刷匠(动态规划)
[BZOJ1296][SCOI2009]粉刷匠(动态规划) 题面 BZOJ 洛谷 题解 一眼题吧. 对于每个串做一次\(dp\),求出这个串刷若干次次能够达到的最大值,然后背包合并所有的结果即可. # ...
- BZOJ 1296: [SCOI2009]粉刷匠 分组DP
1296: [SCOI2009]粉刷匠 Description windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上 ...
- BZOJ 1296: [SCOI2009]粉刷匠( dp )
dp[ i ][ j ] = max( dp[ i - 1 ][ k ] + w[ i ][ j - k ] ) ( 0 <= k <= j ) 表示前 i 行用了 j 次粉刷的机会能正 ...
随机推荐
- CVE-2017-7269-iis远程溢出漏洞复现
##01漏洞描述 cve_2017_7269漏洞属于高危漏洞,是由Zhiniang Peng和Chen Wu(华南理工大学信息安全实验室,计算机科学与工程学院)发现的.IIS 6.0开启Webdav服 ...
- ES6 基本语法:
ES6.基本语法* ES6可以使用=>作为函数表达形式,简单的风格: 参数 + => +函数体;* 在JS中是以var定义一个变量 ,在ES6中是以let定义变量; let 和 var 区 ...
- Java操作RockeMQ
RocketMQ是阿里巴巴在2012年开源的分布式消息中间件,目前已经捐赠给Apache基金会,已经于2016年11月成为 Apache 孵化项目,相信RocketMQ的未来会发挥着越来越大的作用,将 ...
- JS中函数执行顺序的问题?
作者:知乎用户链接:https://www.zhihu.com/question/23564807/answer/82996422来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- Maximum Subsequence Sum(java)
7-1 Maximum Subsequence Sum(25 分) Given a sequence of K integers { N1, N2, ..., NK }. A con ...
- 安全测试中session和cookie
很多朋友做过安全测试应该都知道session和cookies他们的不同点: 1.存取方式不同.----cookie不支持中文,需要编码,仅支持ascll值.session能够存取任何类型的数据,包括j ...
- 推荐一种通过刷leetcode来增强技术功底的方法
背景 如果前人认为这个一种学习提高或者检验能力的成功实践.而自己目前又没有更好的方法,那就不妨试一试. 而不管作为面试官还是被面试者,编码题最近越来越流行.而两种角色都需要思考的问题是希望考察什么能力 ...
- 重学 Java 设计模式:实战中介者模式「按照Mybaits原理手写ORM框架,给JDBC方式操作数据库增加中介者场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 同龄人的差距是从什么时候拉开的 同样的幼儿园.同样的小学.一样 ...
- Springboot--元注解及自定义注解(表单验证)
本文简单说明一下元注解,然后对元注解中的@Retention做深入的讨论,在文章最后使用元注解写一个自定义注解来结尾. 一.结论: @Target:注解的作用目标 @Target(ElementTyp ...
- python实现简单的SVM
# -*- coding: utf-8 -*- from sklearn.svm import SVC import numpy as np print(X.shape,Y.shape) X = np ...