备战蓝桥杯---动态规划(入门3之子串问题)

本专题再介绍几种经典的字串问题。

这是一个两个不重叠字串和的问题,我们只要去枚举分界点c即可,我们不妨让c作为右区间的左边界,然后求[1,c)上的单个字串和并用max数组维护。对于右边,我们只要反向求单个字串和然后选左边界为c的一组即可。

下面是AC代码:

#include<stdio.h>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
long long t,a[50010],b[50010],max1[50010],n,ck[50010],hh;
int main(){
	scanf("%lld",&t);
	while(t--){
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		memset(max1,0,sizeof(max1));
		scanf("%lld",&n);
		for(int i=1;i<=n;i++) scanf("%lld",&ck[i]);
		for(int i=1;i<=n;i++){
			if(i==1){
				 a[i]=ck[i];
				 max1[i]=ck[i];
			}
			else{
			a[i]=max(ck[i],ck[i]+a[i-1]);
			max1[i]=max(max1[i-1],a[i]);}
		}
		for(int i=n;i>=1;i--){
			if(i==n) b[i]=ck[i];
			else b[i]=max(ck[i],ck[i]+b[i+1]);
		}
		hh=-0x3f;
		for(int c=2;c<=n;c++){
			hh=max(hh,max1[c-1]+b[c]);
		}
		printf("%lld\n",hh);
	}
}

接下来,我们加点难度:

现在2变成了m,我们进行升维操作,我们令f[i][j]为前j个数(第j个数必须取)组成的i个不相交子段最大和。

当我们要从j-->j+1时,对于第j+1,它可以作为最后一个子段的末尾,也可以不做末尾而是起点,而此时我们要去得到i-1个不相交子段的max,因此,我们易得转移方程为:

f[i][j]=max(f[i][j-1]+a[j],f[i-1][k]+a[j])

复杂度为o(n^2*m)

我们考虑优化一下:

f[i][j]=a[j]+max(f[i][j-1],f[i-1][k]).

我们只要维护每一个点对应的一列上从上到下的max即可。

至于初始条件,0组的情况都为0(就比如m=1,有一种情况就是只选他自己,因此要赋0)

下面是AC代码(dp数组用滚动即可):

#include<bits/stdc++.h>
using namespace std;
int n,m,a[1000100],mmm;
int ans,dp[1000100];
int ck[1000100];
int main(){
	while(scanf("%d%d",&m,&n)!=EOF){
		ans=-0x3f;
		for(int i=1;i<=n;i++) scanf("%d",&a[i]);
		memset(dp,0,sizeof(dp));
		memset(ck,0,sizeof(ck));
		for(int i=1;i<=m;i++){
			mmm=-0x3f;
			for(int j=i;j<=n;j++){
				dp[j]=max(dp[j-1],ck[j-1])+a[j];
				ck[j-1]=mmm;
				mmm=max(mmm,dp[j]);
			}
		}
		printf("%d\n",mmm);	
	}
}

让我们再加点难度:如果是环状呢?

有一道石子合并的通过复制一份来解决,但是因为这个不能利用上一次划分的情况,换句话说,这一次每次断开都要重新求(原因在于不是区间dp),于是我们不妨想一想另一种方法:

我们知道假如n与1没有被当成一段取,跟上面的就一样了。

如果n与1被当成一段取,那么我们在n与1断开的时候就相当于要求m+1段区间,其中第一段必须包含第一个元素,最后一个必须包含最后一个元素。

下面是AC代码(呜呜呜,直接初值赋了-0x3f,结果当成16进制,检查了好久):

#include<bits/stdc++.h>
using namespace std;
int n,m,a[200100],mmm,mmm1;
int ans,dp[200100],dp1[200100];
int ck[200100],ck1[200100],hou[200100],maxx[200100];
int main(){
	scanf("%d",&n);
	ck1[0]=-10000000;
	ans=-10000000;
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<=n;i++) dp1[i]=a[i]+dp1[i-1];
	for(int i=1;i<=n;i++) ck1[i]=max(dp1[i],ck1[i-1]);
	for(int i=n;i>=1;i--) hou[i]=a[i]+hou[i+1];
	for(int i=n;i>=1;i--){
		if(i==n) maxx[i]=a[i];
		else maxx[i]=max(maxx[i+1],hou[i]);
	}
		for(int i=1;i<=2;i++){
			mmm=-10000000;
			for(int j=i;j<=n;j++){
				dp[j]=max(dp[j-1],ck[j-1])+a[j];
				ck[j-1]=mmm;
				mmm=max(mmm,dp[j]);
			}
		}
		mmm1=-10000000;
		for(int j=2;j<=n;j++){
			dp1[j]=max(dp1[j-1],ck1[j-1])+a[j];
			ck1[j-1]=mmm1;
			mmm1=max(mmm1,dp1[j]);
			}
			
		for(int i=2;i<=n-1;i++){
			ans=max(ans,dp1[i]+maxx[i+1]);
		}
		
		printf("%d\n",max(mmm,ans));	
	
}

接下来,让我们再看看公共子序列问题吧:

我们以前也写过,我们把dp扩展成3维即可。

同时对于方案,我们一般用last数组记录上一次的情况,显然在这里就比较麻烦。我们可以用一个字符串,每次3个的最后一个元素相等时记录一下即可。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

day03-股票数据报表与导出

day03-股票数据表报与导出 目标 理解涨幅榜业务需求;理解涨停跌停概念&#xff0c;并涨停跌停基本实现;理解涨停跌停SQL分析流程&#xff0c;并根据接口文档自定义实现;理解echarts基本使用;掌握easyExcel基本使用,并实现涨幅榜数据导出功能; 第一章 股票涨幅统计 1、涨幅榜…

获取 OpenAI Sora 访问权限:立即申请!

OpenAI的Sora是一种尖端的文本到视频的人工智能模型&#xff0c;它能够根据文本描述创建高清、详细的视频&#xff0c;这让人相当兴奋。这项技术代表了人工智能驱动的内容创作的重大飞跃&#xff0c;通过实现更动态、更吸引人的故事讲述和信息共享&#xff0c;为各个行业带来了…

Linux下多核CPU指定程序运行的核

设置程序在指定CPU核心运行 一、如何查看程序运行的CPU信息 1.1 查看当前系统CPU有几个核心 查看CPU核心数量&#xff1a;lscpu 1.2 查看程序的PID ps aux|grep cpu_test1.3 查看程序可运行的CPU taskset -c -p pid1.4 设置程序在指定核心上运行 1.4.1 通过运行时的参数设…

Linux系统——http协议介绍

目录 引言——Internet起源 一、http协议——超文本传输协议 1.http相关概念 2.访问浏览器的过程 3.http协议通信过程 4.http相关技术 4.1WEB开发语言 4.2html 4.3CSS 4.4JS 5.MIME——Multipurpose Internet Mail Extensions 多用途互联网邮件扩展 6.URI URN URL的…

【CentOS】Linux 文件与目录管理

目录 1、目录的切换、新增和删除 &#xff08;1&#xff09;cd (change directory&#xff0c;切换目录) &#xff08;2&#xff09;pwd (显示目前所在的目录) &#xff08;3&#xff09;mkdir (make directory&#xff0c;建立新目录 ) &#xff08;4&#xff09;rmdir (…

leetcode:494.目标和

解题思路&#xff1a;1.因为每个数字都有正负两种选择&#xff0c;所以可以采用回溯算法。&#xff08;会超时&#xff09; 2.分成两个集合&#xff0c;分别为正数集合&#xff08;left&#xff09;和负数&#xff08;right&#xff09;集合。 left right Sum ---> righ…

阿里云服务器操作系统有哪些?如何选择?

阿里云服务器镜像怎么选择&#xff1f;云服务器操作系统镜像分为Linux和Windows两大类&#xff0c;Linux可以选择Alibaba Cloud Linux&#xff0c;Windows可以选择Windows Server 2022数据中心版64位中文版&#xff0c;阿里云服务器网aliyunfuwuqi.com来详细说下阿里云服务器操…

力扣OJ题——相交链表

题目&#xff1a;160. 相交链表 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 思路一&#xff08;暴力求解&#xff09;&#xff1a; A链表的每个节点依次跟B链表中节点进行…

芯课堂 | 华芯微特系列芯片CAN中断配置

​今天小编给大家带来的是华芯微特全系列芯片如何配置CAN中断模块的详细介绍&#xff0c;包括CAN各自中断以及错误处理方式&#xff0c;大家一起来看看吧。 Part 1&#xff1a;CANRX中断 CAN接受和发送模块各有64位深的FIFO用于缓存&#xff0c;如果像上图一样打开了RX非空中断…

java面试题之redis篇

1.redis 中的数据类型有哪些 随着 Redis 版本的更新&#xff0c;后面又支持了四种数据类型&#xff1a; BitMap&#xff08;2.2 版新增&#xff09;、HyperLogLog&#xff08;2.8 版新增&#xff09;、GEO&#xff08;3.2 版新增&#xff09;、Stream&#xff08;5.0 版新增&am…

C#||应用框体设计计算器

题目&#xff1a; 设计一个简单计算器 思路&#xff1a; 首先在应用框体中设计自己喜欢的计算器格式&#xff0c;接着编辑其中的函数。抽取一个Call函数用来显示从键盘输入的数字&#xff0c;cleanall()函数进行清屏操作&#xff0c;mode&#xff08;&#xff09;函数进行四…

Android EditText关于imeOptions的设置和响应

日常开发中&#xff0c;最绕不开的一个控件就是EditText&#xff0c;随之避免不了的则是对其软键盘事件的监听&#xff0c;随着需求的不同对用户输入的软键盘要求也不同&#xff0c;有的场景需要用户输入完毕后&#xff0c;有一个确认按钮&#xff0c;有的场景需要的是回车&…

ChatGPT如何提供实用且高质量的建议和指导,提高编程效率和准确性

ChatGPT4.0的功能包括&#xff1a; 无限制ChatGPT模型使用 GPT-4模型使用 GPT-4图像分析功能 GPT-4联网功能 GPT-4高级数据分析功能 GPT-4高级插件功能 DALLE-3高级AI绘图功能 如何能高效地处理文本、文献查阅、PPT编辑、编程、绘图和论文写作已经成为您成功的关键。而 …

代码随想录算法训练营第二十三天|669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

669. 修剪二叉搜索树 刷题https://leetcode.cn/problems/trim-a-binary-search-tree/description/文章讲解https://programmercarl.com/0669.%E4%BF%AE%E5%89%AA%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html视频讲解https://www.bilibili.com/video/BV17P41177ud/?sh…

【Java EE初阶十五】网络编程TCP/IP协议(二)

1. 关于TCP 1.1 TCP 的socket api tcp的socket api和U大片的socket api差异很大&#xff0c;但是和前面所讲的文件操作很密切的联系 下面主要讲解两个关键的类&#xff1a; 1、ServerSocket&#xff1a;给服务器使用的类&#xff0c;使用这个类来绑定端口号 2、Socket&#xf…

【高阶数据结构】B+树

文章目录 1. B树的概念2. B树的查找3. B-树 VS B树4. B 树的插入分析 1. B树的概念 B树是B树的变形&#xff0c;是在B树基础上优化的多路平衡搜索树&#xff0c;B树的规则跟B树基本类似&#xff0c;但是又在B树的基础上做了一些改进优化。 一棵m阶的B树需满足下列条件&#x…

Vue+OpenLayers7入门到实战:OpenLayers加载船讯网航海地图瓦片到地图上

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7 前言 本章介绍如何使用OpenLayers7在地图上加载船讯网航海地图瓦片到地图上的功能。 适用于海运等海洋相关行业使用。 二、依赖和使用 "ol": "7.5.2"使用npm安装依赖npm install ol@7.5.2使用Yarn安装…

IDEA连接database数据库

文章目录 一、连接数据库1、连接mysql2、连接参数配置3、配置驱动从maven仓库下载&#xff1a;要求联网将提前下载好的jar放到本地目录 4、完成 二、执行sql1、选择要操作的数据库2、执行sql 三、问题1、可能因为时区问题连接不上 一、连接数据库 1、连接mysql 2、连接参数配置…

为什么从没有负值的数据中绘制的小提琴图(Violin Plot)会出现负值部分?

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 小提琴图&#xff08;Violin Plot&#xff09; 是一种用于展示和比较数据分布的可视化工具。它结合了箱形图&#xff08;Box Plot&#xff09;和密度图&#xff08;Kernel Density Plot&#xff09;的特…

1、OI 赛事与赛制

赛事简介 信息学奥林匹克竞赛(英语:Olympiad in Informatics,简称:OI)是一门在中学生中广泛开展的学科竞赛,和物理、数学等竞赛性质相同。OI 考察的内容是参赛者运用算法、数据结构和数学知识,通过编写计算机程序解决实际问题的能力。 OI 竞赛种类繁多,仅中国就包括: …