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

来源:互联网 发布:网络兼职写小说 编辑:程序博客网 时间:2024/06/05 17:10

题目链接:点击打开链接

编辑距离,,== 一边dp一边记录前驱太累,,还是dp后找路径大法好

#include<iostream>#include<cstdio>#include<vector>#include<string.h>using namespace std;#define ll int#define N 1010char 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\n", pos, c);else if(op == 0)printf("INSERT %d %c\n", pos +1, c);else if(op == 1)printf("DELETE %d\n", 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\n", dp[n][m]);dfs(n, m);}return 0;}


0 0