712.cc 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include <string>
  2. using std::string;
  3. /* BEGIN */
  4. #include <cstring>
  5. #include <algorithm>
  6. using std::min;
  7. #define L 1000
  8. #define INF 1e8
  9. int dp[L + 1][L + 1];
  10. class Solution {
  11. public:
  12. int minimumDeleteSum(string s1, string s2) {
  13. memset(dp, 0, sizeof(dp));
  14. for (int i = 1; i <= s1.size(); i++) { // The boundary is very important!
  15. dp[i][0] = dp[i - 1][0] + s1.at(i - 1);
  16. }
  17. for (int j = 1; j <= s2.size(); j++) {
  18. dp[0][j] = dp[0][j - 1] + s2.at(j - 1);
  19. }
  20. for (int i = 1; i <= s1.size(); i++) {
  21. for (int j = 1; j <= s2.size(); j++) {
  22. int c1 = s1.at(i - 1), c2 = s2.at(j - 1);
  23. int cost = min(dp[i - 1][j] + c1, dp[i][j - 1] + c2);
  24. if (c1 == c2) {
  25. dp[i][j] = min(dp[i - 1][j - 1], cost);
  26. } else {
  27. dp[i][j] = min(dp[i - 1][j - 1] + c1 + c2, cost);
  28. }
  29. }
  30. }
  31. return dp[s1.size()][s2.size()];
  32. }
  33. };
  34. /* END */
  35. #include <iostream>
  36. using std::cout; using std::endl;
  37. int main() {
  38. string s1 = "delete";
  39. string s2 = "leet";
  40. Solution *sol = new Solution();
  41. int ans = sol->minimumDeleteSum(s1, s2);
  42. cout << s1 << " vs " << s2 << ": " << ans << endl;
  43. s1 = "sea";
  44. s2 = "eat";
  45. ans = sol->minimumDeleteSum(s1, s2);
  46. cout << s1 << " vs " << s2 << ": " << ans << endl;
  47. s1 = "a";
  48. s2 = "at";
  49. ans = sol->minimumDeleteSum(s1, s2);
  50. cout << s1 << " vs " << s2 << ": " << ans << endl;
  51. }