最小编辑代价---动态规划

来源:互联网 发布:小米软件系统 编辑:程序博客网 时间:2024/06/16 03:24

对于两个字符串A和B,我们需要进行插入、删除和修改操作将A串变为B串,
定义c0,c1,c2分别为三种操作的代价
给定三种操作代价,字符串A和B,求出将A串变为B串所需要的最少代价。
保证两串长度均小于等于300,且三种代价值均小于等于100。
测试样例:
5 3 100
abc
adc
返回:8

public class Main {    public static void main(String[] args) {        Scanner sc=new Scanner(System.in);        int c0=sc.nextInt();        int c1=sc.nextInt();        int c2=sc.nextInt();        String A=sc.next();        String B=sc.next();        sc.close();        int n=A.length();        int m=B.length();        int[][] dp=new int[n+1][m+1];//A串前i个字符变为B串前j个字符的代价        for (int i=0;i<n+1;i++){           dp[i][0]=c1*i;        }        for (int i=0;i<m+1;i++){           dp[0][i]=c0*i;        }               for (int i=1;i<n+1;i++){            for (int j=1;j<m+1;j++) {                if (A.charAt(i-1)==B.charAt(j-1)){//字符相同则无需代价                    dp[i][j]=dp[i-1][j-1];                }else{//若字符不同,A串删,A串,或A串改;B串不动                    dp[i][j]=Math.min(dp[i-1][j]+c1,dp[i][j-1]+c0);                    dp[i][j]=Math.min(dp[i-1][j-1]+c2,dp[i][j]);                }            }        }        System.out.println(dp[n][m]);        //空间改善,翻滚法        int [][]dp2 = new int[n + 1][2];        for(int i = 0; i <= n; i++){            dp2[i][0] = c1 * i;        }        for(int j = 1; j <= m; j++) {            dp2[0][1] = c0 * j;            for(int i = 1; i <= n; i++) {                if(A.charAt(i - 1) == B.charAt(j - 1)) {                    dp2[i][1] = dp2[i - 1][0];                }else {                    dp2[i][1]=Math.min(dp2[i-1][1]+c1, dp2[i][0]+c0);                    dp2[i][1]=Math.min(dp2[i][1], dp2[i-1][0]+c2);                }            }            for(int i = 0; i <= n; i++) {                dp2[i][0] = dp2[i][1];            }        }        System.out.println(dp2[n][1]);    }}
原创粉丝点击