链接:https://ac.nowcoder.com/acm/contest/77127/C
来源:牛客网
只要一个由
𝑁
×
𝑀
N×M 个小方块组成的棋盘符合如下规则,就是小曲喜欢的棋盘。
- 从最上方若干行(至少一行)的格子全部是白色的;
- 接下来若干行(至少一行)的格子全部是蓝色的;
- 剩下的行(至少一行)全部是红色的;
现有一个棋盘状的布,分成了
𝑁
N 行
𝑀
M 列的格子,每个格子是白色蓝色红色之一。小曲希望把这个布改成她喜欢的样子,方法是在一些格子上涂颜料,盖住之前的颜色。
小曲很懒,希望涂最少的格子,使这个棋盘成为她喜欢的棋盘。
输入描述:
输入共
𝑁
+
1
N+1 行。
第一行是两个整数
𝑁
,
𝑀
N,M。
接下来
𝑁
N 行是一个矩阵,矩阵的每一个小方块是W
(白),B
(蓝),R
(红)中的一个。
输出描述:
一个整数,表示至少需要涂多少块。
示例1
输入
复制
4 5
WRWRW
BWRWB
WRWRW
RWBWR
输出
复制
11
说明
目标状态是
WWWWW
BBBBB
RRRRR
RRRRR
一共需要改
11
11 个格子。
备注:
对于
70
%
70% 的数据,
𝑁
,
𝑀
≤
50
N,M≤50,且
min
{
𝑁
,
𝑀
}
≥
3
min{N,M}≥3。
对于
100
%
100% 的数据,
𝑁
,
𝑀
≤
2000
N,M≤2000,且
min
{
𝑁
,
𝑀
}
≥
3
min{N,M}≥3。
思路:分别记录要将某一行全部换为某一颜色所需的次数,枚举蓝色第一行与最后一行的位置利用
前缀和计算后取最小值即可。
include[HTML_REMOVED]
using namespace std;
const int N=2010;
int w[N],b[N],r[N];
char s;
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i)
{
for(int j=1;j<=m;j)
{
cin>>s;
if(s!=’W’) w[i];
if(s!=’B’) b[i];
if(s!=’R’) r[i];
}
}
for(int i=1;i<=n;i)
{
w[i]+=w[i-1];
b[i]+=b[i-1];
r[i]+=r[i-1];
}
int ans=1e9+10;
for(int i=2;i<n;i)
{
for(int j=i;j<n;j)//j=i
{
ans=min(ans,w[i-1]+b[j]-b[i-1]+r[n]-r[j]);
}
}
cout<<ans<<endl;
return 0;
}