51nod 1183 编辑距离

来源:互联网 发布:数据库事务特性 编辑:程序博客网 时间:2024/06/05 06:15

51nod 1183 编辑距离

根据LCS的思路,做两字符串的比较。
f(i,j)表示A字符串在1–i,于B字符串在1–j时的最小改变量。
递推式:
f(i,j) = min(f(i – 1, j – 1) + same(i,j), f(i – 1,j ) + 1, f(i, j – 1) + 1)
初始值:
f(0, j) = j
f(i, 0) = i

#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <queue>#include <map>using namespace std;#define LL long long#define INF 0x3f3f3f3f#define PI acos(-1.0)#define E 2.71828#define MOD 1000000007#define N 1010char a[N],b[N];int dp[N][N];int main(){    memset(dp,0,sizeof(dp));    scanf("%s%s",a+1,b+1);    a[0] = b[0] = ' ';    int lena = strlen(a);    int lenb = strlen(b);    for(int i = 0; i < lena; i++)    {        for(int j = 0; j < lenb; j++)        {            if(i == 0 || j == 0)                dp[i][j] = i==0?j:i;            else            {                int x = min(dp[i-1][j],dp[i][j-1])+1;                dp[i][j] = min(x, dp[i-1][j-1]+!(a[i]==b[j]));            }        }    }    printf("%d\n",dp[lena-1][lenb-1]);    return 0;}

输出dp图:

这里写图片描述

由于只需要最后一行的值,那么就像01背包一样可以优化空间。

char a[N],b[N];int dp[N];int main(){    memset(dp,0,sizeof(dp));    scanf("%s%s",a+1,b+1);    a[0] = b[0] = ' ';    int lena = strlen(a);    int lenb = strlen(b);    for(int i = 0; i < lenb; i++)   //第一行初始值    {        dp[i] = i;        //printf("%3d",dp[i]);    }    //puts("");    int next;    for(int i = 1; i < lena; i++)    {        for(int j = 0; j < lenb; j++)        {            if(j == 0)            {                next = dp[j];       //左上角的值保存(即dp[i-1][j-1])                dp[j] = i;          //每行的最左边初始值            }            else            {                int x = min(dp[j-1],dp[j])+1;                int y = next+!(a[i]==b[j]);                next = dp[j];                dp[j] = min(x,y);            }            //printf("%3d",dp[j]);        }        //puts("");    }    printf("%d\n",dp[lenb-1]);    return 0;}
0 0
原创粉丝点击