题目传送门:涂条纹 - 洛谷
主要思路:
不多说,直接暴力枚举每一层所需要的代价
1.输入+预处理要转换为W B R的代价
定于 shuzu【51】【4】 , shuzu【i】【1~3】分别存储转成W B R的代价
int n,m,a,b,c;
cin>>n>>m;
string x;
for(int i=1;i<=n;i++){
a=b=c=0;
cin>>x;
for(int j=0;j<m;j++){
if(x[j]=='W') a++;
if(x[j]=='B') b++;
if(x[j]=='R') c++;
}
shuzu[i][1]=m-a;
shuzu[i][2]=m-b;
shuzu[i][3]=m-c;
}
2.第一行和最后一行固定
定义q存储
q+=shuzu[n][3]+shuzu[1][1];
3.枚举转换为B的起点和终点(i和j)
定义anss存储每一次答案(每次循环开始anss=0)
定义ans存储最小代价
for(int i=2;i<=n-1;i++){
for(int j=i;j<=n-1;j++){
//注意是可以长度为1,可以从i开始模拟终点
anss=0;
for(int k=i;k<=j;k++) anss+=shuzu[k][2];//模拟B
for(int k=i-1;k>=2;k--) anss+=shuzu[k][1];//模拟W
for(int k=j+1;k<=n-1;k++) anss+=shuzu[k][3];//模拟R
ans=min(ans,anss);
}
}
4.输出
cout<<ans+q;
return 0;
AC CODE
#include<iostream>
using namespace std;
int ans=0x2f2f2f,anss,q,shuzu[51][4];//ans定义大一点,取最小值
int main(){
int n,m,a,b,c;
cin>>n>>m;
string x;
for(int i=1;i<=n;i++){
a=b=c=0;
cin>>x;
for(int j=0;j<m;j++){
if(x[j]=='W') a++;
if(x[j]=='B') b++;
if(x[j]=='R') c++;
}
shuzu[i][1]=m-a;
shuzu[i][2]=m-b;
shuzu[i][3]=m-c;
}
q+=shuzu[n][3]+shuzu[1][1];
for(int i=2;i<=n-1;i++){
for(int j=i;j<=n-1;j++){
anss=0;
for(int k=i;k<=j;k++) anss+=shuzu[k][2];
for(int k=i-1;k>=2;k--) anss+=shuzu[k][1];
for(int k=j+1;k<=n-1;k++) anss+=shuzu[k][3];
ans=min(ans,anss);
}
}
cout<<ans+q;
return 0;
}