十一届蓝桥杯java组-蓝肽子序列-动态规划

1. 思路-动态规划

典型的最长公共子串问题,可参考leetcode1143. 最长公共子序列,官方有详细解析,对动态规划还不了解的可以先学习动态规划的知识,去leetcode刷些相关题再看本题。
思路:
1. dp[i][j],表示蛋蓝质1前i个蓝肽子和蛋蓝质2前j个蓝肽子最长子序列为dp[i][j]个。
2. 当i=0或j=0时,dp[i][j]==0;
3. 转换公式:
str1(蛋蓝质1),str2(蛋蓝质2);
str1[i]==str2[j]时,dp[i][j]==dp[i-1][j-1]+1;
str1[i]==str2[j]时,dp[i][j]==Math.max(dp[i-1][j],dp[i][j-1]);

2. code

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class 蓝肽子序列_动态规划 {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		String a=sc.next();
		String b=sc.next();
		sc.close();
		List<String> l1=new ArrayList<>();
		List<String> l2=new ArrayList<>();
		StringBuilder sb=new StringBuilder();
		//字符串转换为容器,方便操作
		for (int i = 0; i < a.length();) {
			sb.setLength(0);
			sb.append(a.charAt(i++));
			while(i<a.length()&&a.charAt(i)>90) {
				sb.append(a.charAt(i++));
			}
			l1.add(sb.toString());
		}
		for (int i = 0; i < b.length();) {
			sb.setLength(0);
			sb.append(b.charAt(i++));
			while(i<b.length()&&b.charAt(i)>90) {
				sb.append(b.charAt(i++));
			}
			l2.add(sb.toString());
		}
		//动态规划解题
		int[][] dp=new int[l1.size()+1][l2.size()+1];
		for (int i = 1; i <= l1.size(); i++) {
			String c1=l1.get(i-1);
			for (int j = 1; j <= l2.size(); j++) {
				if(c1.equals(l2.get(j-1))) dp[i][j]=dp[i-1][j-1]+1;
				else dp[i][j]=Math.max(dp[i-1][j], dp[i][j-1]);
			}
		}
		System.out.println(dp[l1.size()][l2.size()]);
	}
}

InputLanQiaoBei
LanTaiXiaoQiao

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值