<-- home

AtCoder ABC 099 D

https://atcoder.jp/contests/abc099/tasks/abc099_d

D - Good Grid

マスを条件を満たすように塗り替えたときの、最小コスト(「違和感」)を求める問題。

コストに影響するのは、塗り替える前後の色のみで、マスの位置は関係ない。実際に、のマスを色Cに塗り替えたときのコストを数式で表すとわかるが、これらのマスについての色の分布さえわかればいい。こういった問題では、余分な情報を取り除いて、統計量で表すなどしてまとめる方針で考える。

色の数は高々30なので、それぞれのマスを塗り替える色のパターンを全探索する。

実装

#define MAX_N 500
#define MAX_C 30

i64 G[MAX_N][MAX_N];
i64 D[MAX_C][MAX_C];
i64 dist[3][MAX_C];

int main() {
    i64 N, C; cin >> N >> C;
    REP(i, C) REP(j, C) cin >> D[i][j];
    REP(i, N) REP(j, N) { cin >> G[i][j]; G[i][j]--; };

    REP(i, 3) REP(j, C) dist[i][j] = 0;

    REP(i, N) REP(j, N) {
        dist[(i + j) % 3][G[i][j]]++;
    }

    i64 minc = 1152921504606846976;
    REP(c0, C) REP(c1, C) REP(c2, C) {
        if (c0 == c1 || c1 == c2 || c2 == c0) continue;
        vector<i64> colors = {c0, c1, c2};
        i64 cost = 0;
        REP(rem, 3) {
            REP(c, C) {
                cost += D[c][colors[rem]] * dist[rem][c];
            }
        }
        chmin(minc, cost);
    }
    cout << minc << endl;

    return 0;
}