51NOD 1183编辑距离(动态规划)

》》点击进入原题测试《《

思路:这个题放在基础题,分值还是零分,好歹也给人家动态规划一点面子啊!刚开始写的想法是找到其最大公共字串,然后用两个字符串中最长字符串的长度减掉最大公共字符串的长度,这个思路应该也是对的,几天前写的,好像没用动态规划写然后错了;然后百度了下是用动态规划,然后重新写了下。换了个思路,然后手写了下样例的dp数组,寻找状态之间的关系。

 

以下AC代码:

#include<string>
#include<iostream>
using namespace std;
const int max = 1010;
int dp[max][max];
int main()
{
    string a, b; cin >> a >> b;
     
    for (int i = 0; i <= a.length(); i++){
        for (int j = 0; j <= b.length(); j++){
            if (i == 0){
                dp[0][j] = j;
            }
            else{
                
                if (j == 0){
                    dp[i][0] = i;
                    continue;
                }
                
                if (a[i - 1] == b[j - 1]) dp[i][j] = dp[i - 1][j - 1];
                else dp[i][j] = dp[i - 1][j - 1] + 1;

                if (dp[i][j] > dp[i][j - 1] + 1)dp[i][j] = dp[i][j - 1] + 1;
                if (dp[i][j] > dp[i - 1][j] + 1)dp[i][j] = dp[i - 1][j] + 1;
                
            }
        }
    }
    cout << dp[a.length()][b.length()] << endl;
    return 0;
}

 

posted @ 2018-07-22 23:26  我只有一件白T恤  阅读(148)  评论(0编辑  收藏  举报