Advertisement
Guest User

Untitled

a guest
Oct 17th, 2019
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.90 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstring>
  3. #include <cmath>
  4. #include <vector>
  5. #include <algorithm>
  6. using namespace std;
  7. int n, m, dp[1 << 20], d[20][20];
  8. string s;
  9.  
  10. int f(int b) {
  11. if(b == (1 << m) - 1)
  12. return 0;
  13. if(dp[b] != -1)
  14. return dp[b];
  15. int mn = 99999999;
  16. for(int i = 0; i < m; ++i)
  17. if(~b & (1 << i)) {
  18. int c = 0, cnt = 1;
  19. vector<int> v;
  20. for(int j = 0; j < 20; ++j)
  21. if(b & (1 << j))
  22. v.push_back(d[i][j]);
  23. sort(v.begin(), v.end());
  24. for(int j = 0; j < v.size(); ++j)
  25. c += v[v.size() - j - 1] * (j + 1);
  26. mn = min(mn, c + f(b | (1 << i)));
  27. }
  28. return dp[b] = mn;
  29. }
  30. int main() {
  31. cin >> n >> m >> s;
  32. memset(dp, -1, sizeof dp);
  33. n = unique(s.begin(), s.end()) - s.begin();
  34. for(int i = 1; i < n; ++i)
  35. ++d[s[i] - 'a'][s[i - 1] - 'a'], ++d[s[i - 1] - 'a'][s[i] - 'a'];
  36. cout << f(0) << endl;
  37. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement