您的位置:首页 > 其它

51nod 1183 编辑距离

2016-03-06 09:59 330 查看
因为题目已经说了有三种操作,那就定义状态dp[i][j]表示第一个字符串前i个字符与第二个字符串前j个字符,要相同所需要的最少操作,然后状态的转移就是三种操作最小的那个了。感觉这种题和那个最长公共字串问题很像。

#include <iostream>
#include <cstring>
#include <cstdio>

const int MAX = 1e3 + 5;
char arr1[MAX];
char arr2[MAX];
int dp[MAX][MAX];

int tmp_min(int a, int b, int c)
{
if (a > b)
a = b;
if (a > c)
return c;
else
return a;
}

int main()
{
scanf("%s%s", arr1 + 1, arr2 + 1);
int lenth1 = strlen(arr1 + 1);
int lenth2 = strlen(arr2 + 1);
for (int i = 0; i <= lenth1; ++i)
dp[i][0] = i;
for (int j = 0; j <= lenth2; ++j)
dp[0][j] = j;
for (int i = 1; i <= lenth1; ++i)
{
for (int j = 1; j <= lenth2; ++j)
{
int cost = arr1[i] == arr2[j] ? 0 : 1;
dp[i][j] = tmp_min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + cost);
}
}

std::cout << dp[lenth1][lenth2] << std::endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: