解いた問題のソースコードと解説など。


SRM 466 Div2 Hard MatrixGame

問題

http://apps.topcoder.com/stat?c=problem_statement&pm=10861&rd=14150

'1'か'0'を要素に持つvector string が与えられる。行か列の交換を好きなだけ行なって辞書順最小のものを返せ。

やりかた

まず列の入れ替え方を全順列で試してみて、その中で行の入れ替えはソートで行う。そうして全順列中で辞書順最小のものを取る。

以下ソース。

class MatrixGame {
public:
  vector <string> getMinimal(vector <string> matrix) {
    vector <string> result = matrix;
    int H = matrix.size();
    int W = matrix[0].size();

    int num[10];
    for(int i = 0; i < W; i++) num[i] = i;
    do{
      vector<string> cur = matrix;
      for(int i = 0; i < H; i++)
	for(int j = 0; j < W; j++)
	  cur[i][j] = matrix[i][num[j]];
      sort(ALL(cur));
      if(result > cur) result = cur;
    }while(next_permutation(num, num + W));
    return result;
  }
};

これができないのはまずかったなあ。

SRM 464, 465はまた後日。

Get up! 明日のSUPER ST@R!