洛谷 P1279 字串距离 dp动态规划 java

//本题参考题解区第一位
//https://www.luogu.org/problemnew/solution/P1279

//dp[i-1][j-1]表示字符串a前i-1位,与字符串b前j-1位的最优解,就是最小距离
//那么当a和b各加上一位后,只把焦点盯在a和b的最后一位所对应的字符
//那么有以下三种情况
//1,a的最后一位对应为空dp[i-1][j]+k
//2,b的最后一位对应为空dp[i][j-1]+k
//3,a和b的最后一位相互对应dp[i-1][j-1]+Math.abs(a.charAt(i-1)-b.charAt(j-1))
//这里要注意的就是,这道题目的空格插入不会影响到a和b字符串的相应位置字符的改变

//然后dp求三者中最小值即可

//注意,dp数组的初始化
//for(int i=1;i<=a.length();i++) {
//	dp[i][0]=dp[i-1][0]+k;
//}
//for(int j=1;j<=b.length();j++) {
//	dp[0][j]=dp[0][j-1]+k;
//}
//即除dp[0][0]外的第0行和第0列,的最小值就是k乘以k的个数,k的个数就是相应的i值或j值
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        String a=in.nextLine();
        String b=in.nextLine();
        int k=in.nextInt();
        int [][]dp=new int[a.length()+1][b.length()+1];
        for(int i=1;i<=a.length();i++) {
            dp[i][0]=dp[i-1][0]+k;
        }
        for(int j=1;j<=b.length();j++) {
            dp[0][j]=dp[0][j-1]+k;
        }
        for(int i=1;i<=a.length();i++) {
            for(int j=1;j<=b.length();j++) {
                dp[i][j]=Math.min(Math.min(dp[i-1][j]+k,dp[i][j-1]+k),
                        dp[i-1][j-1]+Math.abs(a.charAt(i-1)-b.charAt(j-1)));
//				0 2 4 6 8 
//				2 4 6 8 10 
//				4 6 5 6 8 
//				6 8 7 8 10 
//				10
                
                
//				dp[i][j]=Math.min(dp[i-1][j]+k,dp[i-1][j-1]+Math.abs(a.charAt(i-1)-b.charAt(j-1)));
//  此时运行错误
//				0 2 4 6 8 
//				2 4 6 8 10 
//				4 6 5 6 9 
//				6 8 7 8 11 
//				11
            }
        }
       System.out.println(dp[a.length()][b.length()]);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值