12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- #include <string>
- using std::string;
- /* BEGIN */
- #include <cstring>
- #include <algorithm>
- using std::min;
- #define L 1000
- #define INF 1e8
- int dp[L + 1][L + 1];
- class Solution {
- public:
- int minimumDeleteSum(string s1, string s2) {
- memset(dp, 0, sizeof(dp));
- for (int i = 1; i <= s1.size(); i++) { // The boundary is very important!
- dp[i][0] = dp[i - 1][0] + s1.at(i - 1);
- }
- for (int j = 1; j <= s2.size(); j++) {
- dp[0][j] = dp[0][j - 1] + s2.at(j - 1);
- }
- for (int i = 1; i <= s1.size(); i++) {
- for (int j = 1; j <= s2.size(); j++) {
- int c1 = s1.at(i - 1), c2 = s2.at(j - 1);
- int cost = min(dp[i - 1][j] + c1, dp[i][j - 1] + c2);
- if (c1 == c2) {
- dp[i][j] = min(dp[i - 1][j - 1], cost);
- } else {
- dp[i][j] = min(dp[i - 1][j - 1] + c1 + c2, cost);
- }
- }
- }
- return dp[s1.size()][s2.size()];
- }
- };
- /* END */
- #include <iostream>
- using std::cout; using std::endl;
- int main() {
- string s1 = "delete";
- string s2 = "leet";
- Solution *sol = new Solution();
- int ans = sol->minimumDeleteSum(s1, s2);
- cout << s1 << " vs " << s2 << ": " << ans << endl;
- s1 = "sea";
- s2 = "eat";
- ans = sol->minimumDeleteSum(s1, s2);
- cout << s1 << " vs " << s2 << ": " << ans << endl;
- s1 = "a";
- s2 = "at";
- ans = sol->minimumDeleteSum(s1, s2);
- cout << s1 << " vs " << s2 << ": " << ans << endl;
- }
|