您的位置:首页 > 其它

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

2017-09-01 17:59 197 查看
对于两个字符串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
[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
[1]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: