蓝桥杯每日一题----区间dp

前言

暂时没啥好说的,直接进入正题吧

引入

涂色PAINT


读题发现要求的是使一段区间满足要求的最小操作次数,考虑用动态规划去做。
第一步:考虑缩小规模,这里的规模其实就是区间长度,那么dp数组应该可以表示某个区间,所以到这里dp数组至少是二维的,也就是dp[i][j],表示让区间[i,j]合法的最小操作次数。
第二步:考虑限制,这里暂时看不出来有啥限制,那就先不管。
第三步:根据写出来的dp数组推转移方程,dp[i][j]可以从三个地方转移dp[i-1][j],dp[i][j-1],dp[i-1][j-1],考虑这三个转移有什么特点,假设我现在已经求出了dp[i-1][j-1]的染色次数,那么当s[i]=s[j]时,我只需要在对dp[i-1][j-1]染色之前,把区间[i,j]进行一次涂色,涂成s[i]的颜色,这样再执行dp[i-1][j-1]得到的就是对区间[i,j]染成了要求的颜色,那么染色次数dp[i][j]=dp[i-1][j-1]+1;假设我现在已经求出了dp[i-1][j]的染色次数,那么当s[i]=s[j]时,我只需要在对第j个木板进行染色时同时捎带着把第i个木板染了就行,那么染色次数dp[i][j]=dp[i-1][j];假设我现在已经求出了dp[i][j-1]的染色次数,那么当s[i]=s[j]时,我只需要在对第i个木板进行染色时同时捎带着把第j个木板染了就行,那么染色次数dp[i][j]=dp[i][j-1];可以考虑三者取最小值。
综上,当s[i]=s[j]时,dp[i][j]=min(dp[i-1][j-1]+1,dp[i][j-1],dp[i-1][j])
那么当s[i]!=s[j]时,没有办法直接求这个大区间,那么就从小区间考虑,即断开区间。假设断点是k,分别求dp[i][k]和dp[k+1][j],再加起来即可,对于不同的断点取最小值。
第四步:考虑要写代码了,这里要注意一下dp数组如何初始化,我们可以明确的知道,区间长度为1时,所需要的操作次数就是1,所以初始化区间长度为1的值。我们要求的是最小值,其它位置上的值可以初始化为一个较大的值,也可以直接是0,但是在求解过程中要特判一下。
第五步:考虑区间dp的板子,区间dp一般三层for循环,第一层遍历区间长度,一般由2开始。
第二层遍历区间左端点,根据区间左端点和区间长度,区间右端点也就出来了。
第三层遍历区间断点。
这道题目就分析完了,还是给了两个版本的代码,一个是我初学时写的,一个是现在写的,都能AC,但是现在写的更规范一点

package java动态规划;import java.util.Arrays;
import java.util.Scanner;public class ok涂色 {
public static void main(String[] args) {Scanner scanner = new Scanner(System.in);char s[] = (" "+scanner.next()).toCharArray();int n = s.length-1;int dp[][] = new int[n+1][n+1];for(int i = 0;i <= n;i++) Arrays.fill(dp[i], Integer.MAX_VALUE/2);for(int i = 0;i <= n;i++) dp[i][i] = 1;for(int len = 2;len <= n;len++) {for(int l = 1;l+len-1<=n;l++) {int r = len+l-1;if(s[l]==s[r]) dp[l][r] = Math.min(dp[l+1][r], dp[l][r-1]);else {for(int k = l;k < r;k++)dp[l][r] = Math.min(dp[l][r], dp[l][k]+dp[k+1][r]);}}}System.out.println(dp[1][n]);
}
}
import java.util.Scanner;
public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String string = scanner.next();char[] s = string.toCharArray();int[][] dp = new int[string.length()][string.length()];// 初始化for (int i = 0; i < dp.length; i++) {dp[i][i] = 1;}for (int i = 1; i < string.length(); i++) {for (int j = 0; j + i < string.length(); j++) {int l = j;int r = j + i;if (s[l] == s[r]) {dp[l][r] = Math.min(dp[l + 1][r], dp[l][r - 1]);} else {for (int k = l; k < r; k++) {if (dp[l][r] != 0) {dp[l][r] = Math.min(dp[l][k] + dp[k + 1][r], dp[l][r]);} else {dp[l][r] = dp[l][k] + dp[k + 1][r];}}}}}System.out.println(dp[0][string.length() - 1]);}
}

例题2

合并回文子串

这道题稍微难一点,关键在于要想到用区间dp去做,并且明确区间是谁。我们要合并字符串A和B,那么可以考虑一点一点的合并,比如A的某个区间和B的某个区间进行合并。
第一步:考虑规模,这里的规模就是要合并的两个字符串,那么其实也就是有两个区间,字符串A的区间和字符串B的区间,那么dp数组就是四维的,dp[i][j][k][l]表示将字符串Ai-Aj与字符串Bk-Bl是否能形成回文串,如果可以那么回文串的长度就是(j-i+1)+(l-k+1).
第二步:考虑限制,限制就是不能更改原串字符的相对顺序,但是这里不知道怎么加在dp数组中,暂时一放。
第三步:推状态转移方程
对于dp[i][j][k][l],考虑一下如果怎么变成回文,i和j可以是对应的回文,j和k也可以是对应的回文,i和l可以是对应的回文,k和l可以是对应的回文。
那么考虑i和k可以是对应的回文吗?若可以,那么位置k必然是在l的右边,这样就打乱了数组B的原始顺序,所以是不可以的,其它非法方案也是类似。
若A[i]=A[j],则dp[i][j][k][l]可以从dp[i-1][j-1][k][l]转移过来,我只是想判断这种情况是否是回文,若是则为1,否则则为0,所以转移的时候可以直接用或运算转移,即dp[i][j][k][l]|=dp[i-1][j-1][k][l]。其他情况类似,于是有这样的转移方程,
若A[i]=A[j],则dp[i][j][k][l]|=dp[i+1][j-1][k][l]
若A[j]=A[k],则dp[i][j][k][l]|=dp[i][j][k+1][l-1]
若A[i]=A[l],则dp[i][j][k][l]|=dp[i+1][j][k][l-1]
若A[k]=A[j],则dp[i][j][k][l]|=dp[i][j+1][k-1][l]
当相等的情况不满足时,其实也就是无法构成回文,不必考虑。
第四步:考虑写代码,这里有两个区间,所以前两个for循环分别表示两个区间的长度,后两个for循环分别表示区间的左端点,因为这里没有断开区间操作,所以不用遍历断点。这里在写的时候注意是从区间长度为0开始遍历的,当总区间长度小于等于1时必然是回文,也就是len1+len2<=1时,直接是dp[i][j][k][l]=1。当然也可以预处理出来总长度为1的情况,但是不要漏处理了。

参考代码

import java.util.Scanner;
public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int t = scanner.nextInt();while (t > 0) {t--;String a = scanner.next();String b = scanner.next();int n1 = a.length();int n2 = b.length();int dp[][][][] = new int[n1 + 5][n1 + 5][n2 + 5][n2 + 5];a = " " + a + " ";b = " " + b + " ";int res = 0;for (int len1 = 0; len1 < n1 + 1 ; len1++) {for (int len2 = 0; len2 < n2 + 1; len2++) {for (int l1 = 1, r1 = len1 + l1 - 1; r1 < n1 + 1; l1++, r1++) {for (int l2 = 1, r2 = len2 + l2 - 1; r2 < n2 + 1; l2++, r2++) {
//                      int r1 = len1+l1-1;
//                      int r2 = len2+l2-1;if (len1 + len2 <= 1) {dp[l1][r1][l2][r2] = 1;} else {if (r2 > 0 && a.charAt(l1) == b.charAt(r2))dp[l1][r1][l2][r2] |= dp[l1 + 1][r1][l2][r2 - 1];if (r1 > 0 && a.charAt(r1) == b.charAt(l2))dp[l1][r1][l2][r2] |= dp[l1][r1 - 1][l2 + 1][r2];if (r1 > 0 && a.charAt(l1) == a.charAt(r1))dp[l1][r1][l2][r2] |= dp[l1 + 1][r1 - 1][l2][r2];if (r2 > 0 && b.charAt(l2) == b.charAt(r2))dp[l1][r1][l2][r2] |= dp[l1][r1][l2 + 1][r2 - 1];if (dp[l1][r1][l2][r2] == 1) {res = Math.max(res, len1 + len2);}}}}}}System.out.println(res);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/668042.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中小学信息学奥赛CSP-J认证 CCF非专业级别软件能力认证-入门组初赛模拟题一解析(选择题)

CSP-J入门组初赛模拟题一&#xff08;选择题&#xff09; 1、以下与电子邮件无关的网络协议是 A、SMTP B、POP3 C、MIME D、FTP 答案&#xff1a;D 考点分析&#xff1a;主要考查小朋友们网络相关知识的储备&#xff0c;FTP是文件传输协议和电子邮件无关&#xff0c;所以…

在vscode上传项目到gitee

一、在Gitee上新建一个仓库 Tip&#xff1a;若已经创建过了&#xff0c;直接跳到第二部分看VsCode如何上传代码到Gitee 创建仓库比较简单&#xff0c;下面两张图就是整个过程&#xff0c;这里不在赘述&#xff0c;具体如下&#xff1a; 二、VsCode连接Gitee上创建的仓…

STM32L4学习

STM32L4系列是围绕Cortex-M4构建&#xff0c;具有FPU和DSP指令集&#xff0c;主频高达80MHz。 STM32CubeL4简介 STM32Cube 是 ST 提供的一套性能强大的免费开发工具和嵌入式软件模块&#xff0c;能够让开发人员在 STM32 平台上快速、轻松地开发应用。它包含两个关键部分&…

C# 信号量(Semaphore)详细使用案例

文章目录 简介信号量的工作原理使用场景使用示例其他使用实例1. 数据库连接池管理2. 文件读写同步3. 生产者消费者问题4. 打印任务队列同步5. Web服务器并发请求限制 简介 在C#中&#xff0c;信号量&#xff08;Semaphore&#xff09;是.NET框架提供的一个同步类&#xff0c;位…

如何在Shopee平台上进行测款选品

在如今竞争激烈的电商市场&#xff0c;选择合适的产品成为卖家们提高销售业绩的重要一环。在Shopee平台上进行测款选品&#xff0c;可以帮助卖家找到符合市场需求的产品&#xff0c;提高销售业绩。本文将介绍一些策略和步骤&#xff0c;帮助卖家在Shopee平台上进行测款选品。 …

【Docker】入门到精通(常用命令解读)

一、准备工作 1.配置Docker的yum库 首先要安装一个yum工具 yum install -y yum-utils安装成功后&#xff0c;执行命令&#xff0c;配置Docker的yum源&#xff1a; yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo2.安装Docker 执…

ReactNative实现弧形拖动条

我们直接看效果 先看下面的使用代码 <CircularSlider5step{2}min{0}max{100}radius{100}value{30}onComplete{(changeValue: number) > this.handleEmailSbp(changeValue)}onChange{(changeValue: number) > this.handleEmailDpd(changeValue)}contentContainerStyle{…

FreeCAD的python脚本编写

简介 FreeCAD是一款强大的开源CAD软件&#xff0c;可以与python无缝对解&#xff0c;使用python来驱动三维几何的构建&#xff0c;具有很高的灵活性。本文主要讨论一下录制宏的方法&#xff0c;以及如何驱动特定参数 方法 打开FreeCAD软件&#xff0c;点击录制宏按钮后&…

建筑行业数字化:从设计到运维的全面革新

随着科技的快速发展&#xff0c;数字化技术在各行各业中的应用越来越广泛。建筑行业作为传统产业&#xff0c;也在积极拥抱数字化技术&#xff0c;以提高效率、降低成本并实现可持续发展。本文将主要探讨建筑行业数字化的几个关键领域&#xff0c;包括建筑设计数字化、施工管理…

配置visualsvn提交后自动邮件通知

参考&#xff1a; https://blog.csdn.net/wiker_yong/article/details/10334967 # -*- coding: utf-8 -*- import sys import os import smtplib from email.mime.text import MIMEText from email.header import Headermail_host smtp.163.com #发送邮件的smtp地址 mail_us…

JS第二天、原型、原型链、正则

☆☆☆☆ 什么是原型&#xff1f; 构造函数的prototype 就是原型 专门保存所有子对象共有属性和方法的对象一个对象的原型就是它的构造函数的prototype属性的值。prototype是哪来的&#xff1f;所有的函数都有一个prototype属性当函数被创建的时候&#xff0c;prototype属性…

Lightroom Classic 2024 --- LR2024

Lightroom Classic 2024是一款专业的图片编辑和照片管理软件&#xff0c;旨在帮助摄影师高效地处理、编辑和展示他们的作品。通过强大的组织工具&#xff0c;用户可以轻松地管理、搜索和筛选大量的照片。该软件提供了全面的编辑工具&#xff0c;包括调整颜色、曝光、对比度、白…

Linux网络通信——TCP/OSI七层模型/TCP/IP(五层或四层模型)/HTTP报文传输原理

文章目录 消息的传输什么是OSI七层模型OSI七层模型的内容物理层&#xff08;Physical Layer&#xff09;&#xff1a;数据链路层&#xff08;Data Link Layer&#xff09;&#xff1a;网络层&#xff08;Network Layer&#xff09;&#xff1a;传输层&#xff08;Transport Lay…

On the Spectral Bias of Neural Networks论文阅读

1. 摘要 众所周知&#xff0c;过度参数化的深度神经网络(DNNs)是一种表达能力极强的函数&#xff0c;它甚至可以以100%的训练精度记忆随机数据。这就提出了一个问题&#xff0c;为什么他们不能轻易地对真实数据进行拟合呢。为了回答这个问题&#xff0c;研究人员使用傅里叶分析…

Oracle12c之Sqlplus命令行窗口基本使用

Oracle12c之Sqlplus命令行窗口基本使用 文章目录 Oracle12c之Sqlplus命令行窗口基本使用1. 连接1. 超级用户2. 普通用户1. 创建普通用2. 连接 2. 修改用户连接数1. 查看默认连接最多用户数1. PL/SQL developer中查看2. Sqlplus中查看 2. 查看目前已经连接的用户数3. 修改用户连…

设计模式-行为型模式(上)

行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务&#xff0c;它涉及算法与对象间职责的分配。 行为型模式分为类行为模式和对象行为模式&#xff0c;前者采用继承机制来在类间分派行为&…

Docker 搭建mysql 集群(二)

PXC方案 很明显 PXC方案在任何一个节点写入的数据都会同步到其他节点&#xff0c;数据双向同步的&#xff08;在任何节点上都可以同时读写&#xff09; 创建MySQL PXC集群 1 安装PXC镜像 docker pull percona/percona-xtradb-cluster:5.7.21 2 为PXC镜像改名 docker tag pe…

如何选择旅游路线,使得假期旅游路费最少?

旅行是许多人的热爱&#xff0c;但是在规划一个完美的假期时&#xff0c;找到最经济的路线常常是一个挑战。这里就需要引入一个著名的优化问题——旅行商问题。本文将介绍TSP的基础知识&#xff0c;并使用MTZ消除子环方法优化一个简单的TSP问题的示例。 旅行商问题简介 TSP&a…

用友U8 Cloud ReportDetailDataQuery SQL注入漏洞复现(QVD-2023-47860)

0x01 产品简介 用友U8 Cloud 提供企业级云ERP整体解决方案,全面支持多组织业务协同,实现企业互联网资源连接。 U8 Cloud 亦是亚太地区成长型企业最广泛采用的云解决方案。 0x02 漏洞概述 用友U8 cloud ReportDetailDataQuery 接口处存在SQL注入漏洞,攻击者未经授权可以访…

自然语言nlp学习五

6-10 文本生成--介绍_哔哩哔哩_bilibili 在自然语言处理&#xff08;NLP, Natural Language Processing&#xff09;领域&#xff0c;“sequence”通常是指一个有序的数据集合&#xff0c;它由一系列元素按照特定顺序排列而成。这些元素可以是单词、字符、句子或其他文本单位。…