备战蓝桥杯---动态规划(入门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.hqwc.cn/news/478453.html

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

相关文章

java基础训练题(2)

一、题目 1. 以下程序输出&#xff08;D&#xff09; public static void main(String[] args) {int num 2;switch (num) {case 1:num;case 2:num;case 3:num;default:num;break;}System.out.println(num);} } A&#xff1a;2 B&#xff1a;3 C&#xff1a;4 D&#xff…

Maxwell - 增量数据

前言 今天来学习一个新的大数据小工具 Maxwell &#xff0c;它和 Sqoop 很像。Sqoop主要用于在 Hadoop &#xff08;比如 HDFS、Hive、HBase 等&#xff09;和关系型数据库之间进行数据的批量导入和导出&#xff0c;而 Maxwell 则主要用于监控数据库的变化&#xff08;通过监控…

Electron实战之菜单与托盘

菜单、托盘是桌面端应用必备的功能之一&#xff0c;我们通常会在菜单上配置应用常用的&#xff1a;偏好设置、显示隐藏、打开文件等功能&#xff0c;在托盘内设置&#xff1a;退出、重启、帮助等辅助性功能&#xff0c;帮助用户方便快捷地控制应用的一些系统功能。系统托盘实际…

ubuntu解决“E: Unable to locate package lrzsz“

今天在ubuntu上安装rzsz包时报错&#xff0c;提示无法定位包&#xff0c;提示如下 出现这个问题是因为apt的源没有更新&#xff0c;我们直接说解决办法 把下面的命令执行一遍即可 sudo add-apt-repository main sudo add-apt-repository universe sudo add-apt-repository re…

GitHub仓库文件部署

目录 软件下载和安装 git创建仓库 Github仓库配置 git管理软件配置 Git管理 软件下载和安装 首先需要下载git&#xff0c;以及git管理软件&#xff0c;对其进行安装。 git创建仓库 首先需要创建仓库&#xff0c;在本地仓库文件夹cmd之后输入以下指令创建git仓库文件。 …

2024-2-19-IO作业

1> 要求: 源代码: #include <myhead.h> #define MAXSIZE 64 int main(int argc, char const *argv[]) {FILE *src NULL;FILE *dest NULL;if ((src fopen("./hbao.bmp", "r")) NULL){perror("fopen error");return -1;}if ((dest …

Vue | (三)使用Vue脚手架(上) | 尚硅谷Vue2.0+Vue3.0全套教程

文章目录 &#x1f4da;初始化脚手架&#x1f407;创建初体验&#x1f407;分析脚手架结构&#x1f407;关于render&#x1f407;查看默认配置 &#x1f4da;ref与props&#x1f407;ref属性&#x1f407;props配置项 &#x1f4da;混入&#x1f4da;插件&#x1f4da;scoped样…

150173-72-1,BODIPY 558/568 羧酸,一种疏水性荧光染料

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;BODIPY 558/568 羧酸&#xff0c;BODIPY 558/568 carboxylic acid &#xff0c;BODIPY 558/568 COOH&#xff0c;150173-72-1 一、基本信息 产品简介&#xff1a;BODIPY 558/568 COOH拥有高量子产率和消光系数&…

视频监控需求八问:视频智能分析/视频汇聚平台EasyCVR有何特性?

最近TSINGSEE青犀视频在与业内伙伴进行项目合作的过程中&#xff0c;针对安防监控可视化视频管理系统EasyCVR视频融合平台在电信运营商项目中的应用&#xff0c;进行了多方面的项目需求沟通。今天我们就该项目沟通为案例&#xff0c;来具体了解一下用户关心度较高的关于视频智能…

Eclipse - Makefile generation

Eclipse - Makefile generation References right mouse click on the project -> Properties -> C/C Build -> Generate Makefiles automatically 默认会在 Debug 目录下创建 Makefile 文件。 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

Redis 缓存(Cache)

什么是缓存 缓存(cache)是计算机中的一个经典的概念在很多场景中都会涉及到。 核心思路就是把一些常用的数据放到触手可及(访问速度更快)的地方&#xff0c;方便随时读取。 这里所说的“触手可及”是个相对的概念 我们知道&#xff0c;对于硬件的访问速度来说&#xff0c;通常…

Eclipse - Text Editors (文本编辑器)

Eclipse - Text Editors [文本编辑器] References Window -> Preferences -> General -> Editors -> Text Editors Displayed tab witdth: 4 勾选 Insert spaces for tabs 勾选 Show line number References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.n…