1. 程式人生 > >洛谷 P3392 塗國旗

洛谷 P3392 塗國旗

targe stream 狀態 -c bar 方法 radi name esp

P3392 塗國旗

題目描述

某國法律規定,只要一個由N*M個小方塊組成的旗幟符合如下規則,就是合法的國旗。(毛熊:阿嚏——)

  • 從最上方若幹行(>=1)的格子全部是白色的。

  • 接下來若幹行(>=1)的格子全部是藍色的

  • 剩下的行(>=1)全部是紅色的

現有一個棋盤狀的破布,分成了N行M列的格子,每個格子是白色藍色紅色之一,小a希望把這個布改成該國國旗,方法是在一些格子上塗顏料,蓋住之前的顏色。

小a很懶,希望塗最少的格子,使這塊破布成為一個合法的國旗。

輸入輸出格式

輸入格式:

第一行是兩個整數,N,M

接下來N行是一個矩陣,矩陣的每一個小方塊是‘W‘(白),‘B‘(藍),‘R‘(紅)中的一個

輸出格式:

一個整數,表示至少需要塗多少塊。

輸入輸出樣例

輸入樣例#1: 復制
4 5
WRWRW
BWRWB
WRWRW
RWBWR
輸出樣例#1: 復制
11

說明

樣例解釋:

目標狀態是

WWWWW
BBBBB
RRRRR
RRRRR

一共需要改11個格子

對於100%的數據,N,M<=50

#include<cstdio>
#include<cstring>
#include
<iostream> #include<algorithm> using namespace std; int n,m,ans=0x7f7f7f7f; int sum[51][4]; string s; int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ cin>>s; sum[i][0]=sum[i-1][0];sum[i][1]=sum[i-1][1];sum[i][2]=sum[i-1][2];
for(int j=0;j<m;j++){ if(s[j]==W) sum[i][0]++; else if(s[j]==B) sum[i][1]++; else if(s[j]==R) sum[i][2]++; } } for(int i=1;i<=n;i++) for(int j=1;j<=n-i;j++) if(n-i-j>0) ans=min(ans,i*m-sum[i][0]+j*m-sum[j+i][1]+sum[i][1]+(n-i-j)*m-sum[n][2]+sum[i+j][2]); cout<<ans; }

洛谷 P3392 塗國旗