712.cc 1.5 KB

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