题解:f[i][1]表示用1种颜色涂完i行费用
#include <iostream>
#include <cstdio>
using namespace std;
#define INF 0x3f3f3f3f
int n,m;
int w[100],b[100],r[100];
int f[100][4];
char s[100][100];
void init()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
scanf("%s",s[i]+1);
}
void work()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(s[i][j]=='W') w[i]++;
if(s[i][j]=='B') b[i]++;
if(s[i][j]=='R') r[i]++;
}
}
void dp()
{
for(int i=1;i<=n;i++) f[i][1]=f[i][2]=f[i][3]=INF;//预处理
for(int i=1;i<=n;i++)
{
if(i<=n-2)
f[i][1]=f[i-1][1]+(m-w[i]);
if(i>=2&&i<=n-1)
f[i][2]=min(f[i-1][1],f[i-1][2])+(m-b[i]);
if(i>=3)//注意下转移的要求
f[i][3]=min(f[i-1][2],f[i-1][3])+(m-r[i]);
}
printf("%d\n",f[n][3]);
}
int main()
{
init();
work();
dp();
return 0;
}