码迷,mamicode.com
首页 > 其他好文 > 详细

20180706模拟赛T2——染色

时间:2018-07-06 19:45:11      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:数据   一段   规模   需要   限制   个数   整数   连续   颜色   

文件名: seq
题目类型: 传统题
时间限制: 1秒
内存限制: 128MB
编译优化:

题目描述

小A正在帮助小M刷她家的墙壁
小M家的墙可以分为\(n\)块,每段需要被刷成黑色或者白色。你可以认为每一块墙最开始时既不是黑色也不是白色。
小M有一把神奇的刷子,每次可以刷连续的一段墙,但先刷的颜色会被后刷的颜色覆盖。这把刷子只能够用\(k\)
现在小A想要知道,最多能正确地刷对多少块墙的颜色。

输入格式

第一行两个正整数\(n,k\)
接下来\(n\)个整数,每个整数都是0或者1表示这块墙需要被刷成的颜色。

输出格式

共一行一个整数,表示最多能刷对几块墙的颜色。

样例输入

5 2
0 1 0 1 0

样例输出

4

样例解释

先刷1到5,再刷2到4

数据规模与约定

对于30%的数据,\(n≤3000\)
对于另30%的数据,\(k≤3\)
对于100%的数据,\(n≤100000,k≤50\)

题解

首先,对于一块墙,刷一定不比不刷劣,因为你可以在刷其它块的时候捎带着刷掉这块。

我们发现如果刷完后没完全符合,那一定有\(2k-1\)段,因为每一次刷的颜色不可能与旁边几段颜色相同,也不可能完全覆盖之前刷的一段)。

于是我们就可以从左往右扫了,于是我们考虑dp。

\(f[i][j][0/1]\)表示刷到第\(i\)块,刷了\(j\)次,最左边那块是白色/黑色,不难得出转移方程

dp[i][j][0] = max(dp[i-1][j-1][1], dp[i-1][j][0]) + (tmp == 0);
dp[i][j][1] = max(dp[i-1][j-1][0], dp[i-1][j][1]) + (tmp == 1);

tmp是读入的第i个数。

20180706模拟赛T2——染色

标签:数据   一段   规模   需要   限制   个数   整数   连续   颜色   

原文地址:https://www.cnblogs.com/pfypfy/p/9275105.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!