mayoko’s diary

プロコンとかいろいろ。

SRM 551 div1 med: ColorfulWolves

問題

TopCoder Statistics - Problem Statement

あるオオカミは, 毎夜毛の色を変える。毛は colormap[i][j] = Y のとき i -> j に色を変えることができる。毛を変えるアルゴリズムは, colormap[i][j] = Y を満たす 最小の j に毛の色を変える, というものである。このオオカミは, 毛の色を(一日で良いので) N-1 に変えたい。そのために, colormap 情報の Y の部分を N に変更できる。この変更の最小回数を求めよ。

解法

同じところに戻ってくるのが無駄である(というかそうなったら N-1 にたどり着くことはできない)ことがわかるとどの頂点も高々 1 回しか通らないということができます。

なので, dp[i] = (色 i に到達するまでに必要な最小変更回数)というのを最短経路風に更新していけば解けます。

const int INF = 1e9;
int dp[55];

class ColorfulWolves {
public:
    int getmin(vector <string> colormap) {
        int n = colormap.size();
        for (int i = 0; i < n; i++) {
            dp[i] = INF;
        }
        dp[0] = 0;
        for (int _ = 0; _ < n*n; _++) {
            for (int i = 0; i < n; i++) if (dp[i] < INF) {
                int cnt = 0;
                for (int j = 0; j < n; j++) {
                    if (colormap[i][j] == 'Y') {
                        dp[j] = min(dp[j], dp[i]+cnt);
                        cnt++;
                    }
                }
            }
        }
        if (dp[n-1] == INF) return -1;
        return dp[n-1];
    }
    };