【动态规划】最小编辑代价

来源:互联网 发布:保险网络推广 编辑:程序博客网 时间:2024/06/08 02:48


  • 空间限制:32768K
  • 本题知识点: 动态规划

题目描述

对于两个字符串A和B,我们需要进行插入、删除和修改操作将A串变为B串,定义c0,c1,c2分别为三种操作的代价,请设计一个高效算法,求出将A串变为B串所需要的最少代价。

给定两个字符串AB,及它们的长度和三种操作代价,请返回将A串变为B串所需要的最小代价。保证两串长度均小于等于300,且三种代价值均小于等于100。

测试样例:
"abc",3,"adc",3,5,3,100
返回:8
import java.util.*;public class Main {    public static void main(String args[]){        String A="bbca";        String B="cabacab";        System.out.println(new Main().findMinCost(A,A.length(),B,B.length(),1,2,7));        System.out.println();        A="abc";        B="adc";        System.out.println(new Main().findMinCost(A,A.length(),B,B.length(),5,3,100));    }    public int findMinCost(String A, int n, String B, int m, int c0, int c1, int c2) {        int len=n>m?n:m;        /*d[i][j]表示字符串A的前i个字符构成的子串        和字符串B的前j个字符构成的子串的最短编辑距离d[n][m]为所求最终结果*/        int d[][]=new int[len+1][len+1];        /*可以直接替换或者是先删除后添加,取代价较小者*/        c2=Math.min(c0+c1,c2);        /*边界条件*/        for(int i=0;i<=len;i++){            /*A变成BB为空,只能保持B不变,A删除字符*/            d[i][0]=i*c1;        }        for(int j=0;j<=len;j++){            /*A为空,要把A变为B,保持B不变,A添加字符*/            d[0][j]=j*c0;        }        /*转移方程*/        for(int i=1;i<=n;i++){            for(int j=1;j<=m;j++){                if(A.charAt(i-1)==B.charAt(j-1)){                    d[i][j]=d[i-1][j-1];                }else{                    d[i][j]=min(d[i-1][j]+c1,/*A多了一个字符,删除*/                                d[i][j-1]+c0,/*A少了一个字符,插入*/                                d[i-1][j-1]+c2);/*修改*/                }            }        }        printTable(d,len,len);        return d[n][m];    }    public int min(int a,int b,int c){        int t=a>b?b:a;        return t>c?c:t;    }    public void printTable(int[][] d,int x,int y){        for(int i=0;i<x;i++){           for(int j=0;j<y;j++){               System.out.print(d[i][j]);               System.out.print("\t");           }            System.out.println();        }    }}



0 0