Problem:
ロシアの旗 (Russian Flag)

問題

K 理事長はロシアで開催される IOI 2016 に合わせて旗を作ることにした．K 理事長はまず倉庫から古い旗を取り出してきた．この旗は N 行 M 列のマス目に分けられていて，それぞれのマスには白・青・赤のいずれかの色が塗られている．

K 理事長はこの旗のいくつかのマスを塗り替えてロシアの旗にしようとしている．ただし，この問題でいうロシアの旗とは以下のようなものである．

上から何行か (1 行以上) のマスが全て白で塗られている．

続く何行か (1 行以上) のマスが全て青で塗られている．

それ以外の行 (1 行以上) のマスが全て赤で塗られている．

K 理事長が古い旗をロシアの旗にするために塗り替える必要のあるマスの個数の最小値を求めよ．

入力

入力は 1 + N 行からなる．

1 行目には，2 つの整数 N, M (3 ≦ N ≦ 50, 3 ≦ M ≦ 50) が空白を区切りとして書かれている．これは，旗が N 行 M 列のマス目に区切られていることを表す．

続く N 行にはそれぞれ M 文字からなる文字列が書かれており，古い旗のマス目に塗られている色の情報を表す．N 行のうちの i 行目の j 文字目 (1 ≦ i ≦ N, 1 ≦ j ≦ M) は，古い旗のマス目の i 行目 j 列目のマスの色を表す 'W', 'B', 'R' のいずれかの文字である．
'W' は白，'B' は青，'R' は赤を表す．

出力

K 理事長が古い旗をロシアの旗にするために塗り替える必要のあるマスの個数の最小値を 1 行で出力せよ．

入出力例

入力例 1

4 5
WRWRW
BWRWB
WRWRW
RWBWR

出力例 1

11

入力例 2

6 14
WWWWWWWWWWWWWW
WBBBWWRRWWBBBW
WWBWWRRRRWWBWW
BWBWWRRRRWWBWW
WBBWWWRRWWBBBW
WWWWWWWWWWWWWW

出力例 2

44

入出力例 1 において，古い旗には下図のように色が塗られている．

下図において，'X' の書かれた 11 個のマスを塗り替える．

これにより下図のようなロシアの旗にすることができる．

11 個未満のマスを塗り替えることではロシアの旗にすることはできないため，11 を出力する．

入出力例 2 においては，古い旗には下図のように色が塗られている．

情報オリンピック日本委員会作 『第 15 回日本情報オリンピック JOI 2015/2016 予選競技課題』

Solution in C# (judge verdict: Accepted)

using System;
using System.Linq;

namespace _0621
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] x = Console.ReadLine().Split().Select(int.Parse).ToArray();
            char[,] s = new char[x[0], x[1]];
            for (int i = 0; i < x[0]; i++)
            {
                string now = Console.ReadLine();
                for (int j = 0; j < x[1]; j++)
                {
                    s[i, j] = now[j];
                }
            }
            int b = x[0] * x[1];
            for (int i = 0; i < x[0] - 2; i++)
            {
                for (int j = i; j < x[0] - 1; j++)
                {
                    int a = 0;
                    for (int k = 0; k < x[0]; k++)
                    {
                        for (int l = 0; l < x[1]; l++)
                        {
                            if (k <= i)
                            {
                                if (s[k, l] != 'W')
                                {
                                    a++;
                                }
                            }
                            else if (k <= j)
                            {
                                if (s[k, l] != 'B')
                                {
                                    a++;
                                }
                            }
                            else
                            {
                                if (s[k, l] != 'R')
                                {
                                    a++;
                                }
                            }
                        }
                    }
                    if (b > a)
                    {
                        b = a;
                    }
                }
            }
            Console.WriteLine(b);
        }
    }
}