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];
        }
  • 相关阅读:
    POJ 1300 Open Door
    POJ 2230 Watchcow
    codevs 1028 花店橱窗布置
    codevs 1021 玛丽卡
    codevs 1519 过路费
    codevs 3287 货车运输
    codevs 3305 水果姐逛水果街二
    codevs 1036 商务旅行
    codevs 4605 LCA
    POJ 1330 Nearest Common Ancestors
  • 原文地址:https://www.cnblogs.com/team42/p/6736000.html
Copyright © 2011-2022 走看看