想法:先保存要涂满1到n-2行的白色的格子数,然后是蓝色、红色,最后分别遍历白蓝红格子数:i行,j行,n-i-j行,求出最小值
#include <iostream>
#include <stdlib.h>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
using namespace std;
char arr[55][55];
int w[55],b[55],r[55],answ=0,ansb=0,ansr=0;
int main(){
int n,m;
cin>>n>>m;
int minn=n*m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>arr[i][j];
}
}
for(int i=1;i<=n-2;i++){
for(int j=1;j<=m;j++){
if(arr[i][j]!='W') answ++;
}
w[i]=answ;
//cout<<w[i]<<endl;
}
for(int i=2;i<=n-1;i++){
for(int j=1;j<=m;j++){
if(arr[i][j]!='B') ansb++;
}
b[i-1]=ansb;
//cout<<b[i-1]<<endl;
}
for(int i=3;i<=n;i++){
for(int j=1;j<=m;j++){
if(arr[i][j]!='R') ansr++;
}
r[i-2]=ansr;
//cout<<r[i-2]<<endl;
}
for(int i=1;i<=n-2;i++){
for(int j=1;j<=n-2;j++){
if(w[i]+b[j]+r[n-i-j]<=minn){
minn=w[i]+b[j]+r[n-i-j];
//cout<<i<<" "<<j<<" "<<n-2-i-j<<endl;
}
}
}
cout<<minn<<endl;
return 0;
}