fork download
  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <climits>
  5.  
  6. using namespace std;
  7.  
  8. const int MAX = 200;
  9. int f[MAX][MAX]; // mảng lưu kết quả quy hoạch động
  10. string s;
  11. int n;
  12.  
  13. // Hàm quy hoạch động tính số bước chèn tối thiểu
  14. int qhd(int l, int r) {
  15. if (l >= r) return 0; // Nếu chỉ còn 1 ký tự hoặc không còn ký tự
  16. if (f[l][r] != -1) return f[l][r]; // Nếu đã tính trước đó
  17.  
  18. if (s[l] == s[r]) {
  19. // Nếu ký tự ở đầu và cuối giống nhau, không cần thêm bước
  20. f[l][r] = qhd(l + 1, r - 1);
  21. } else {
  22. // Nếu không giống, ta cần thêm 1 bước chèn và chọn cách tốt nhất
  23. f[l][r] = min(qhd(l + 1, r) + 1, qhd(l, r - 1) + 1);
  24. }
  25.  
  26. return f[l][r];
  27. }
  28.  
  29. int main() {
  30. cin >> s; // Đọc xâu đầu vào
  31. n = s.length();
  32.  
  33. memset(f, -1, sizeof(f)); // Khởi tạo mảng f với giá trị -1
  34.  
  35. // In ra kết quả là số bước chèn tối thiểu để biến xâu thành palindrome
  36. cout << qhd(0, n - 1) << endl;
  37.  
  38. return 0;
  39. }
  40.  
Success #stdin #stdout 0.01s 5284KB
stdin
abcabc
stdout
3