P4158 [SCOI2009]粉刷匠(洛谷)

摘要:
风中有N块板需要喷漆。每次Windy画画时,他只能在木板上选择一个连续的网格,然后再画一种颜色。输出格式包含整数和可以正确绘制的最大网格数。输入/输出样本输入#1复制36311111100000001100输出#1复制16描述/提示30%的数据,满足1˂=N,M˂=10;0˂=T˂=100100%数据,1˂=N,M˂=50;0˂=T˂=2500因为有足够的空间,我打开了一个4维数组。所以在max波中还有一件事需要注意。最大值应从中间截取。至于为什么,你可以把样本中的t改为2。

今天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]粉刷匠(洛谷)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇xilinx FPGA课程学习总结用CSS使图片自适应显示宽度下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

编码解码

包含要编码的URI或其他文本的字符串。此方法的目的是完全编码URI。因此,encodeURI()函数不会转义URI中具有特殊含义的以下ASCII标点符号:;/?返回编码字符串的副本。此方法不编码ASCII字母和数字,也不编码以下ASCII标点符号:-_!提示和注释提示:您可以使用unescape()来解码转义()编码的字符串。...

数据不平衡的相关

大多数常见的机器学习算法不能很好地处理不平衡的数据集。例如,搜索引擎的点击预测(点击页面往往占很小的比例)、电子商务中的产品推荐(正在购买的推荐产品的比例很低)、信用卡欺诈检测、网络攻击识别、癌症检测等。处理数据不平衡的方法主要有以下几种。2.数据级别2.1重新采样2.1.1欠采样(下采样)欠采样通过减少丰富类的大小来平衡数据集。它试图通过增加稀有样本的数量...

SQL Server 查看版本信息

SQLServer查看版本信息3种方法:1)使用命令行查看[Win+R]键-˃打开cmd2)使用SSMS查看打开并连接SSMS后查看3)通过服务器属性查看使用SSMS打开并连接指定数据库后,查看服务器属性...

如何从github下载项目的源代码,包含git客户端,直接下载,vs下载

很多小伙伴可能刚刚联系了github。如果他们使用github下载项目,他们将在这里编写一个统一的声明。从各种方式下载源代码,以加深对git的理解。英文描述:Git是一个免费开源的分布式版本控制系统,旨在以快速和高效的方式处理从小型到大型项目的所有事务。例如:在github上下载项目:https://github.com/dathlin/HslCommuni...

R中.rda文件如何读取(专用)

突然,我遇到了一个我不知道如何阅读rda结尾处的文件的人。在检查数据并自己尝试之后,我终于找到了阅读的方法。没有责任!...

Tomcat和JDK版本的对应关系

当我们讨论Tomcat和JDK版本之间的对应关系时,我们实际上讨论了两个问题。对于第一个问题,您可以通过官方网站上的图的最后一列获得答案:因此,如果您安装Tomcat 7,则需要安装JDK1.6和更高版本才能正常启动Tomcat。对于第二个问题,我们应该明确第一个问题和第二个疑问有相同的基本答案:低版本JDK不能运行高版本JDK编译的代码。因此,如果您安装T...