mayoko’s diary

プロコンとかいろいろ。

SRM 525 div1 easy:DropCoins

解法

右端から何列落とすか/左端から何列落とすか/上端から何行落とすか/下端から何行落とすか
で場合分けして全探索します。下のコードは O(h^3 w^3) ですが h, w が十分小さいので間に合います。

const int MAXN = 33;
const int INF = 1e9;

class DropCoins {
public:
    int getMinimum(vector <string> board, int K) {
        int n = board.size();
        int m = board[0].size();
        int ans = INF;
        for (int r = 0; r < m; r++) for (int l = 0; l < m; l++) {
            for (int u = 0; u < n; u++) for (int d = 0; d < n; d++) {
                int cnt = 0;
                for (int i = u; i <= n-1-d; i++) {
                    for (int j = l; j <= m-1-r; j++) {
                        if (board[i][j] == 'o') cnt++;
                    }
                }
                if (cnt == K) {
                    int need = 0;
                    need += l+r+min(l, r);
                    need += d+u+min(d, u);
                    ans = min(ans, need);
                }
            }
        }
        if (ans == INF) ans = -1;
        return ans;
    }
};