前缀和优化 O(n^2)
#include <stdio.h>
#define ll long long
using namespace std;
int read(){
int a1=0,k1=1;char c1=getchar();
while(c1<'0'||c1>'9'){
if(c1=='-')k1=-1;c1=getchar();
}
while(c1>='0'&&c1<='9'){
a1=a1*10+c1-'0';
c1=getchar();
}
return a1*k1;
}
inline void out1(ll n) {
if(n < 0)
putchar ('-') , n = -n;
if(n > 9)
out1(n / 10);
putchar(n % 10 + '0');
}
inline void out(ll n){
out1(n);printf("\n");
}
int sumW[55],sumB[55],sumR[55];
char a[55][55];
int/*signed*/ main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
int n=read(),m=read(),x,ans=1<<30;
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
scanf("%c",&a[i][j]);
}
scanf("\n");
}
// for(int i=1;i<=n;++i){
// for(int j=1;j<=m;++j){
// printf("%c ",a[i][j]);
// }printf("\n");
// }
for(int i=1;i<n;++i){ //涂W前缀和
x=0;
for(int j=1;j<=m;++j){
if(a[i][j]!='W')x++;
// x+=(a[i][j]!='W');
}
sumW[i]=sumW[i-1]+x;
// printf("%d ",sumW[i]);
}
// printf("\n");
for(int j=1;j<=n;++j){ //涂B前缀和
x=0;
for(int k=1;k<=m;++k){
if(a[j][k]!='B')x++;
}
sumB[j]=sumB[j-1]+x;
// printf("%d ",sumB[j]);
}
// printf("\n");
for(int i=n;i>2;--i){ //涂R后缀和
x=0;
for(int j=1;j<=m;++j){
if(a[i][j]!='R')x++;
}
sumR[i]=sumR[i+1]+x;
// printf("%d ",sumR[i]);
}
// printf("\n");
for(int i=2;i<n;++i){ // i | i+1
for(int j=i+1;j<=n;++j){ // j | j+1
x=sumW[i-1]+sumB[j-1]-sumB[i-1]+sumR[j];
if(x<ans)ans=x;
// printf("%d %d %d\n",i,j,x);
}
}
printf("%d\n",ans);
return 0;
}
/*
10 20
WBRWBBRWBBRBWBRWBWRB
BRWBWBRBWBRBWBRBWBWB
RBWBWWBWBRWRWBWRRBWR
WBWRWBRBWRWWRWRWBRWB
RWBWRWRWRWWRBWWBRWWR
WBRWBWBWRBRBRBWRWBRW
BRWRWBRWBWRRBWRWBRWW
BWRWRWRRRRRRRRRRRWWR
BBBBBBWRWBBWWRWRRWBW
BRWBRBWBRBWBRBWBRRWW
*/