• Codeforces 56D Changing a String 编辑距离 记忆dp


    主题链接:点击打开链接

    编辑距离。,== 一边dp虽然录制前体累,,依然是dp

    #include<iostream>
    #include<cstdio>
    #include<vector>
    #include<string.h>
    using namespace std;
    #define ll int
    #define N 1010
    char s[N], t[N];
    int dp[N][N], n, m;
    // 0为插入 1为删除 2 3为替换
    struct node{
    	int op;
    	int pos; char c;
    	node(int A=0,int E=0,char D=0):op(A),pos(E), c(D){}
    	void put(){
    		if(op== 2)
    			printf("REPLACE %d %c
    ", pos, c);
    		else if(op == 0)
    			printf("INSERT %d %c
    ", pos +1, c);
    		else if(op == 1)
    			printf("DELETE %d
    ", pos);
    	}
    }P;
    void dfs(int a, int b){
    	if(a == 0 && b==0)return ;
    	if(s[a] == t[b] && dp[a-1][b-1] == dp[a][b])
    		dfs(a-1, b-1);
    	else
    	{
    		if(a && dp[a-1][b] +1 == dp[a][b])
    		{
    			P = node(1, a);
    			P.put();
    			dfs(a-1, b);
    		}
    		else if(b && dp[a][b-1] +1 == dp[a][b])
    		{
    			P = node(0, a, t[b]);
    			P.put();
    			dfs(a, b-1);
    		}
    		else if(a && b && dp[a-1][b-1] +1 == dp[a][b])
    		{
    			P = node(2, a, t[b]);
    			P.put();
    			dfs(a-1, b-1);
    		}
    	}
    }
    void input(){
    	scanf("%s", t+1);
    	n = strlen(s+1);
    	m = strlen(t+1);
    }
    int main(){
    	int i, j;
    	while(~scanf("%s", s+1)){
    		input();
    		dp[0][0] = 0;
    		for(i = 1; i <= n; i++)
    			dp[i][0] = i;
    		for(i = 1; i <= m; i++)
    			dp[0][i] = i;
    		for(i = 1; i <= n; i++)
    			for(j = 1; j <= m; j++)
    				dp[i][j] = min(min(dp[i-1][j], dp[i][j-1])+1, dp[i-1][j-1] + (s[i]!=t[j]));
    		printf("%d
    ", dp[n][m]);		
    		dfs(n, m);
    	}
    	return 0;
    }


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    WordCount的程序设计没写出来怎么办
    小程序分析
    程序单元测试
    Visual studio 2013安装
    四则运算源代码
    在VC环境下执行代码出现错误
    微点评微信软件
    软件工程学习
    查找抄袭文章
    软件附加题简答
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4736948.html
Copyright © 2020-2023  润新知