zoukankan      html  css  js  c++  java
  • Codeforces 56D Changing a String

    http://codeforces.com/contest/56/problem/D

    题目大意:

    一个字符串变为目标字符串,可以执行插入,置换和删除3种操作,求最少操作数。

    思路:dp[i][j]代表当前串前i个变成目标串前j个的最小花费。

     

    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    #define ll long long
    char a[200005],b[200005];
    int n,m;
    ll f[1005][1005];
    int read(){
        int t=0,f=1;char ch=getchar();
        while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
        while ('0'<=ch&&ch<='9'){t=t*10+ch-'0';ch=getchar();}
        return t*f;
    }
    void dfs(int n,int m){
        if (n==0&&m==0){
            return;
        }
        if (n>=1&&f[n][m]==f[n-1][m]+1){
            dfs(n-1,m);
            printf("DELETE %d
    ",m+1);
        }else
        if (m>=1&&f[n][m]==f[n][m-1]+1){
            dfs(n,m-1);
            printf("INSERT %d %c
    ",m,b[m]);
        }else{
            dfs(n-1,m-1);
            if (a[n]!=b[m])
            printf("REPLACE %d %c
    ",m,b[m]);
        }
    }
    int main(){
        scanf("%s",a+1);n=strlen(a+1);
        scanf("%s",b+1);m=strlen(b+1);
        for (int i=0;i<=n;i++)
         for (int j=0;j<=m;j++)
          f[i][j]=0;
        f[0][0]=0;
        for (int i=1;i<=n;i++)
         f[i][0]=i;
        for (int i=1;i<=m;i++)
         f[0][i]=i;
        for (int i=1;i<=n;i++)
         for (int j=1;j<=m;j++)
          f[i][j]=std::min(std::min(f[i-1][j],f[i][j-1])+1,f[i-1][j-1]+(a[i]!=b[j]));
        printf("%I64d
    ",f[n][m]); 
        dfs(n,m); 
    }

     

     

  • 相关阅读:
    http请求
    mac chrome NET::ERR_CERT_INVALID
    百度小程序获取用户手机号
    js 异步总结
    百度小程序 es6 支持情况
    每日日报
    每日日报
    每日日报
    05程序员修炼之道:从小工到专家阅读笔记之二
    05程序员修炼之道:从小工到专家阅读笔记之一
  • 原文地址:https://www.cnblogs.com/qzqzgfy/p/5667921.html
Copyright © 2011-2022 走看看