メモ化する。
貪欲だと思って撃沈した。
- 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());
- }
- };