Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstring>
- #include <cmath>
- #include <vector>
- #include <algorithm>
- using namespace std;
- int n, m, dp[1 << 20], d[20][20];
- string s;
- int f(int b) {
- if(b == (1 << m) - 1)
- return 0;
- if(dp[b] != -1)
- return dp[b];
- int mn = 99999999;
- for(int i = 0; i < m; ++i)
- if(~b & (1 << i)) {
- int c = 0, cnt = 1;
- vector<int> v;
- for(int j = 0; j < 20; ++j)
- if(b & (1 << j))
- v.push_back(d[i][j]);
- sort(v.begin(), v.end());
- for(int j = 0; j < v.size(); ++j)
- c += v[v.size() - j - 1] * (j + 1);
- mn = min(mn, c + f(b | (1 << i)));
- }
- return dp[b] = mn;
- }
- int main() {
- cin >> n >> m >> s;
- memset(dp, -1, sizeof dp);
- n = unique(s.begin(), s.end()) - s.begin();
- for(int i = 1; i < n; ++i)
- ++d[s[i] - 'a'][s[i - 1] - 'a'], ++d[s[i - 1] - 'a'][s[i] - 'a'];
- cout << f(0) << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement