zoukankan      html  css  js  c++  java
  • 最优编辑

    题目:对于两个字符串A和B,我们需要进行插入、删除和修改操作将A串变为B串,定义c0,c1,c2分别为三种操作的代价,请设计一个高效算法,求出将A串变为B串所需要的最少代价。给定两个字符串AB,及它们的长度和三种操作代价,请返回将A串变为B串所需要的最小代价。保证两串长度均小于等于300,且三种代价值均小于等于100。

     思路:生成dp[n+1][m+1]的二维表,列代表s1,开头第一个是空,行代表s2,开头第一个是空,dp[i][j]代表s1[0,,,i]生成s2[0,,,j]的最小代价,比如s1="ab12cd3",s2="abcdf",那么dp[0][0]=0,dp[1][0]就是把s1的第一位‘a’变成空,即删除'a',依次类推求得第一列,同理第一行就是每次增加字符到s1[1,,,i],故也可求得第一行。dp[i][j]分为四种情况,1.s1增加一个字符到s2 ic+dp[i-1][j]      2.s1删除一个字符到s2 dp[i][j-1]+dc     3.s1和s2之前相同,当前不相同,替换当前  dp[i-1][j-1]+rc     4 .s1和s2之前相同,当前也相同,那么dp[i][j]就和dp[i-1][j-1]相同

     public int findMinCost(String A, int n, String B, int m, int c0, int c1, int c2) {
            int[][] dp = new int[n+1][m+1];
            dp[0][0] = 0;
            for(int i=1;i<=n;i++){
                dp[i][0]=i*c1;
            }
            for(int i=1;i<=m;i++){
                dp[0][i]=i*c0;
            }
            for(int i=1;i<=n;i++){
                for(int j=1;j<=m;j++){
                    if(A.charAt(i-1)!=B.charAt(j-1)){
                        dp[i][j]=Math.min(dp[i-1][j-1]+c2,Math.min(dp[i-1][j]+c1,dp[i][j-1]+c0));
                    }else
                        dp[i][j]=dp[i-1][j-1];
                }
            }
            return dp[n][m];
        }
  • 相关阅读:
    HDU 2509 nim博弈
    HDU 1907 nim博弈变形
    HDU 1568 double 快速幂
    HDU 5950 矩阵快速幂
    HDU 1796 容斥原理
    Linux raid信息 查看
    Linux Ubuntu 内核升级
    Ubuntu 14.04 为 root 帐号开启 SSH 登录
    Google 分布式关系型数据库 F1
    分布式事务实现-Spanner
  • 原文地址:https://www.cnblogs.com/team42/p/6736000.html
Copyright © 2011-2022 走看看