[关闭]
@LIUHUAN 2020-01-19T13:28:16.000000Z 字数 927 阅读 588

最小回文切割数

algorithm

迭代方法


- 初始条件是回文串
- 可以从最小子串开始计算,即长度为1的子串。


  1. // 是否是回文的判断
  2. int isPaline(string& s, int i, int j)
  3. {
  4. int r = 1;
  5. while (i < j) {
  6. if (s[i] == s[j]) {
  7. i++;
  8. j--;
  9. } else {
  10. r = 0;
  11. break;
  12. }
  13. }
  14. return r;
  15. }
  16. int mincut(string s)
  17. {
  18. int n = s.size();
  19. vector<vector<int>> pl(n, vector<int>(n, 0));
  20. vector<vector<int>> dp(n, vector<int>(n, n));
  21. for (int i = 0; i < n; i++) {
  22. pl[i][i] = 1;
  23. dp[i][i] = 0;
  24. }
  25. // 计算回文字符串
  26. for (int l = 1; l < n; l++) {
  27. for (int i = 0; i < n - l; i++) {
  28. int j = i + l;
  29. pl[i][j] = isPaline(s, i, j);
  30. }
  31. }
  32. // 计算最小切割数
  33. for (int l = 1; l < n; l++) {
  34. for (int i = 0; i < n - l; i++) {
  35. int j = i + l;
  36. if (pl[i][j] == 1) {
  37. dp[i][j] = 0;
  38. continue;
  39. }
  40. for (int k = i; k < j; k++) {
  41. int cut_cost = dp[i][k] + dp[k + 1][j] + 1;
  42. dp[i][j] = min(dp[i][j], cut_cost);
  43. }
  44. }
  45. }
  46. return dp[0][n - 1];
  47. }
  48. int main()
  49. {
  50. string s("helloworld");
  51. cin >> s;
  52. int r = mincut(s);
  53. cout << s << endl;
  54. cout << s.size() << endl;
  55. cout << r << endl;
  56. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注