メモ化する。
貪欲だと思って撃沈した。
const int N = 11; map<string, string> memo[N]; string rec(string s, int k) { if (k == 0) return s; if (memo[k].count(s)) return memo[k][s]; string mx = "0"; for (int i = 0; i < s.size(); ++i) { for (int j = i + 1; j < s.size(); ++j) { if (i == 0 && s[j] == '0') continue; swap(s[i], s[j]); mx = max(mx, rec(s, k - 1)); swap(s[i], s[j]); } } return memo[k][s] = mx; } class TheSwap { public: int findMax(int n, int k) { char buff[100]; sprintf(buff, "%d", n); string s(buff); bool valid = false; for (int i = 0; i < s.size(); ++i) { for (int j = i + 1; j < s.size(); ++j) { int a = s[i] - '0'; int b = s[j] - '0'; if (a && b) valid = true; if (a == b) valid = true; } } if (!valid) return -1; fill(memo, memo + N, map<string, string>()); return atoi(rec(s, k).c_str()); } };