难度:普及−
算法:暴力枚举
思路:
首先确定每个颜色各占行的取值范围
由题意可知每行至少占1行
白色:1 ~ n - 2 ;(白色最少占一行,最多占行数为 n - 2,因为红色和蓝色至少要占一行)
蓝色:1 ~ n - w - 1; (蓝色最少占一行,最多占n - w - 1, 至于为什么-1,原因在于红色至少需要占一行)
红色:1 ~ n - w - b;
关键点:统计各行颜色的分布情况;
C++代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N = 55;
int n,m,a1[N],a2[N],a3[N];
int ans = 1e9;
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
char ch;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
cin >> ch;
//统计每一行上颜色分布的情况
if(ch == 'W') a1[i] ++;
if(ch == 'B') a2[i] ++;
if(ch == 'R') a3[i] ++;
}
}
//暴力枚举
for(int w = 1; w <= n - 2; w++){ //白色取值范围:1 ~ n - 2;
for(int b = 1; b <= n - w - 1; b ++){ //蓝色取值范围:1 ~ n - w - 1; 至少一行是红色的
//红色取值范围:1 ~ n - w - b;
int sum = 0;
for(int i = 1; i <= w; i++) sum += m - a1[i]; //w行染成白色的数量
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];
ans = min(ans,sum);
}
}
cout << ans << endl;
return 0;
}