【题目描述】
某国法律规定,只要一个由N×MN×M 个小方块组成的旗帜符合如下规则,就是合法的国旗。
从最上方若干行(至少一行)的格子全部是白色的;
接下来若干行(至少一行)的格子全部是蓝色的;
剩下的行(至少一行)全部是红色的;
现有一个棋盘状的布,分成了 NN 行 MM 列的格子,每个格子是白色蓝色红色之一,小 a 希望把这个布改成该国国旗,方法是在一些格子上涂颜料,盖住之前的颜色。
小明很懒,希望涂最少的格子,使这块布成为一个合法的国旗。
【输入】
第一行是两个整数 NN,MM。对于100100%的数据,N,M≤50N,M≤50。
接下来 NN 行是一个矩阵,矩阵的每一个小方块是WW(白),BB(蓝),RR(红)中的一个。
【输出】
一个整数,表示至少需要涂多少块。
【输入样例】
4 5
WRWRW
BWRWB
WRWRW
RWBWR
【输出样例】
11
源代码:
#include <bits/stdc++.h> using namespace std; int main() { int n, m, sum, ans=1e9, a1[55] = {0}, a2[55] = {0}, a3[55] = {0}; char tmp; cin >> n >> m; for (int i=1; i<=n; i++) { for (int j=1; j<=m; j++) { cin >> tmp; if (tmp=='W') a1[i]++; if (tmp=='B') a2[i]++; if (tmp=='R') a3[i]++; } } for (int w=1; w<=n-2; w++) { for (int b=1; b<=n-w-1; b++) { sum = 0; for (int i=1; i<=w; i++) sum += m-a1[i]; for (int i=w+1; i<=w+b; i++) sum += m-a2[i]; for (int i=w+b+1; i<=n; i++) sum += m-a3[i]; if (sum < ans) ans = sum; } } cout << ans; return 0; }