【算法】dp题单
题单链接: https://vjudge.net/contest/574209#overview
目录
1. 洛谷 P1020 导弹拦截 (dp+二分+Dilworth 定理)
2. P1439 最长公共子序列(二分求最长公共子序列)
3. 洛谷 P1854 花店橱窗布置 (线性dp + 用pre数组记录路径)
1. 洛谷 P1020 导弹拦截 (dp+二分+Dilworth 定理)
题目: https://www.luogu.com.cn/problem/P1020
思想:第一问是求最长不上升子序列,即后一项小于等于前一项,由于数据1e5,考虑二分。
首先把当前项小于等于前一项的加入 f 数组,如果当前项大于 f 数组前一项,那么向前找 f 数组的第一项小于当前项的下标,并用当前值代替二分找到的这个数。
第二问是求不上升子序列的个数,根据Dilworth 定理,一个序列若干个单调不升子序列的最小个数等于该序列最长上升子序列的个数,可以知这题求最长上升子序列的个数。首先把当前值大于 f 数组前一项的值加入 f 数组。如果小等于,那么找到 f 数组第一个大于等于当前值的项(为什么是大于等于,而不是大于,因为最长上升子序列要满足严格大于,所以等于的情况也需要被替代),并用当前值代替二分找到的这个值。
考虑一个数列5 2 3 1 4
首先,把5加入答案序列中,然后加2,发现2<5所以显然2替换5不会使结果更差,
那么答案序列就是{2},然后加3,发现3>2,所以直接把3加到答案序列中:{2,3}
然后加1,我们发现1<3,于是我们找到一个最小的但是比1大的数字2,然后把1替换2,为什么这么做不会影响结果呢?你可以这么想,我们当前已经求出了一个当前最优的序列,如果我们用1替换2,然后后面来一个数字替换了3,那么我们就可以得到一个更优的序列,而如果没有数字替换3,那么这个1替换2也就是没有贡献的,不会影响我们结果的最优性。至于,如何找到一个最小的但是大于某个数字的数字,弄个二分查找就行了,因为我们的答案序列是有序的呀。
代码:
// Problem: B - 导弹拦截
// Contest: Virtual Judge - CQJTU-DP题单1——线性DP
// URL: https://vjudge.net/contest/574209#problem/B
// Memory Limit: 131 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)#include<bits/stdc++.h>
using namespace std;typedef long long ll;const int N = 2e5+5;
const int inf = 0x3f3f3f3f;int a[N];
int f[N];int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int x=0;int n=0;while(cin>>x){ a[++n]=x;}memset(f,0,sizeof(f));f[0]=1e9; int cnt=0; for(int i=1;i<=n;i++){if(a[i]<=f[cnt]){ //得到不递增的数组f[++cnt]=a[i]; }else{ int l=1,r=cnt; //找到第一个小于当前导弹高度的元素位置,将其更新为导弹高度while(l<r){int mid=(l+r)/2;if(f[mid]<a[i]){r=mid;}else l=mid+1;}f[l]=a[i];}/*for(int i=1;i<=cnt;i++){cout<<f[i]<<' ';}cout<<"\n";*/}cout<<cnt<<"\n";cnt=0;memset(f,0,sizeof(f));for(int i=1;i<=n;i++){if(a[i]>f[cnt]){ //找到递增数组f[++cnt]=a[i];}else{int l=1,r=cnt;while(l<r){ //找到第一个大于等于当前导弹高度的导弹位置,将其更新为导弹高度int mid=(l+r)/2;if(f[mid]>=a[i]){r=mid;}else l=mid+1;}f[l]=a[i];}/*for(int i=1;i<=cnt;i++){cout<<f[i]<<' ';}cout<<"\n";*/}cout<<cnt<<"\n";return 0; }
2. P1439 最长公共子序列(二分求最长公共子序列)
题目: https://www.luogu.com.cn/problem/P1439
思想:
首先,我们可以想到,最长公共子序列,就是两段所含数字完全一样,并且数字的顺序也是完全一样的序列。
而顺序,我们可以想到类似哈希的思想,考虑建立一个类似map的关系数组f[ai]=i,那么我们找到的序列只要是上升的,顺序就是一样的,然后考虑数字完全一样,由于我们已经有了一个f[ai]=i,所以我们把对应的bi改成f[bi],就可以确保数字相等了呀!
这时,就是在f[bi]的数组中求个最长上升子序列了,二分搞一搞就好了。STL大法好!
代码:
// Problem: C - 最长公共子序列
// Contest: Virtual Judge - CQJTU-DP题单1——线性DP
// URL: https://vjudge.net/contest/574209#problem/C
// Memory Limit: 128 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)#include<bits/stdc++.h>
using namespace std;typedef long long ll;const int N = 2e5+5;
const int inf = 0x3f3f3f3f;int n;
int a[N],b[N];
int f[N];int main(){ios::sync_with_stdio(false);cin.tie(nullptr);cin>>n;map<int,int> mp;for(int i=1;i<=n;i++){cin>>a[i];mp[a[i]]=i;}for(int i=1;i<=n;i++){cin>>b[i];//cout<<mp[b[i]]<<' ';}//cout<<"\n";//mp[b[i]]可以表示a数组中的每个数在b中的位置保证数字一样//然后找最长上升子序列保证顺序一样memset(f,127,sizeof(f));f[0]=0;int cnt=0;for(int i=1;i<=n;i++){if(mp[b[i]]>f[cnt]){ //找到b数组的最长上升子序列f[++cnt]=mp[b[i]];}else{int l=0,r=cnt;while(l<r){int mid=(l+r)/2;if(f[mid]>mp[b[i]]){r=mid;}else l=mid+1;}f[l]=min(mp[b[i]],f[l]);}/*for(int i=1;i<=cnt;i++){cout<<mp[i]<<' ';}cout<<"\n";*/}cout<<cnt<<"\n";return 0; }
3. 洛谷 P1854 花店橱窗布置 (线性dp + 用pre数组记录路径)
题目: https://www.luogu.com.cn/problem/P1854
思想:用 k 遍历 j 找到这一行最大的值,并且用 pre 数组记录当前点前一个位置为 k ,即上一行最大值的位置,结果最大值需要遍历最后一行每一列的值,而不是 f[n][m],然后以这个点往前找
pre数组 ,用pos数组存下每一行的值,最后输出。 pos[i-1] = pre[i][pos[i]]
代码:
// Problem: E - 花店橱窗布置
// Contest: Virtual Judge - CQJTU-DP题单1——线性DP
// URL: https://vjudge.net/contest/574209#problem/E
// Memory Limit: 128 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)#include<bits/stdc++.h>
using namespace std;typedef long long ll;const int N = 1001;
const int inf = 0x3f3f3f3f;int n,m;
int a[N][N];
int f[N][N];
int pre[N][N];
int pos[N];int main(){ios::sync_with_stdio(false);cin.tie(nullptr);cin>>n>>m;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>a[i][j];}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){f[i][j]=-inf;}}memset(pre,0,sizeof(pre));/*for(int i=1;i<=n;i++){f[0][i]=0;}*/for(int i=1;i<=n;i++){f[0][i]=0;for(int j=i;j<=m;j++){for(int k=i-1;k<j;k++){if(f[i-1][k]+a[i][j]>f[i][j]){f[i][j]=f[i-1][k]+a[i][j];pre[i][j]=k;}}}}int maxv=-inf;for(int i=1;i<=m;i++){if(f[n][i]>maxv){pos[n]=i;maxv=f[n][i];}}cout<<maxv<<"\n";for(int i=n;pre[i][pos[i]]!=0;i--){pos[i-1]=pre[i][pos[i]];}for(int i=1;i<=n;i++){cout<<pos[i]<<' ';}cout<<"\n";return 0; }
相关文章:
【算法】dp题单
题单链接: https://vjudge.net/contest/574209#overview 目录 1. 洛谷 P1020 导弹拦截 (dp二分Dilworth 定理) 2. P1439 最长公共子序列(二分求最长公共子序列) 3. 洛谷 P1854 花店橱窗布置 (线性dp 用…...
Verilog视频信号图形显示 FPGA(iCE40)
您需要一块带视频输出的 FPGA 板。 我们将在 640x480 下工作,几乎任何视频输出都可以在此像素工作。 它有助于轻松地对 FPGA 板进行编程并相当熟悉 Verilog。 如果您没有开发板,请不要担心,您可以使用 Verilator 模拟器。 材料 Lattice iCE…...
【LeetCode 面试经典150题】26. Remove Duplicates from Sorted Array 在有序数组中移除重复元素
26. Remove Duplicates from Sorted Array 题目大意 Given an integer array nums sorted in non-decreasing order, remove the duplicates in-place such that each unique element appears only once. The relative order of the elements should be kept the same. Then …...
linux系统下sql脚本的执行与导出
terminal中执行 执行 mysql -u [username] -p -D [databasename] < [XXX.sql] 导出 mysql -u [username] -p [datbasename] > [XXX.sql] 导出的数据库名自定义。 mysql -u [username] -p [databasename] [tablename] > [xxx.sql] 导出表名自定义 mysql shell 执行 …...
MyBatis学习一:快速入门
前言 公司要求没办法,前端也要了解一下后端知识,这里记录一下自己的学习 学习教程:黑马mybatis教程全套视频教程,2天Mybatis框架从入门到精通 文档: https://mybatis.net.cn/index.html MyBatis 快速入门…...
零售业物流这个防漏水技术,居然没有翻车!
随着科技的不断发展,水浸监控系统在各个领域得到了广泛应用。水浸监控不仅仅是为了保护建筑结构和设备,更是为了防范因水灾引起的生命安全和财产损失。 因此,为了有效预防和应对水浸事件,水浸监控系统应运而生,成为各行…...
主浏览器优化之路1——你现在在用的是什么浏览器?Edge?谷歌?火狐?360!?
上一世,我的浏览器之路 引言为什么要用两个浏览器为什么一定要放弃火狐结尾给大家一个猜数字小游戏(测运气) 引言 小时候,我一开始上网的浏览器是2345王牌浏览器吧, 因为上面集成了很多网站,我记得上面有7…...
gitlab请求合并分支
直接去看原文: 原文链接:Gitlab合并请求相关流程_source branch target branch-CSDN博客 --------------------------------------------------------------------------------------------------------------------------------- 入口: 仓库控制台的这两个地方都…...
使用Vue3开发学生管理系统模板1
环境搭建 通过解压之前《Vue3开发后台管理系统模板》的代码,我们能够得到用户增删改查的页面,我们基于用户增删改查的页面做进一步的优化。 创建学生增删改查页面 第一步:复制用户增删改查页面,重命名为StudentCRUD.vue <…...
【cmake实战:番外】交叉编译——Linaro
【cmake实战:番外】交叉编译——Linaro 一、交叉编译1、交叉编译简介2、为什么会有交叉编译 二、交叉编译链1、什么是交叉编译链2、交叉编译工具 三、Linaro1、下载2、解压3、demo3.1、toolchain_aarch64.cmake3.2、CMakeLists.txt3.3、main.cpp 4、执行编译5、查看…...
2024年年初Java5年实战面试题(北京)
高阶篇: 一、在面对千万条并发请求的情况下,如果数据库频繁查询导致崩溃,可以采取以下措施来解决问题: 1.缓存数据:可以使用缓存技术来减少对数据库的查询次数。将经常查询的数据存储在缓存中,例如使用Redis等内存数据库ÿ…...
【Apache-2.0】springboot-openai-chatgpt超级AI大脑产品架构图
springboot-openai-chatgpt: 一个基于SpringCloud的Chatgpt机器人,已对接GPT-3.5、GPT-4.0、百度文心一言、stable diffusion AI绘图、Midjourney绘图。用户可以在界面上与聊天机器人进行对话,聊天机器人会根据用户的输入自动生成回复。同时也支持画图&a…...
如何在iPhone设备中查看崩溃日志
目录 如何在iPhone设备中查看崩溃日志 摘要 引言 导致iPhone设备崩溃的主要原因是什么? 使用克魔助手查看iPhone设备中的崩溃日志 奔溃日志分析 总结 摘要 本文介绍了如何在iPhone设备中查看崩溃日志,以便调查崩溃的原因。我们将展示三种不同的…...
对接第三方接口鉴权(Spring Boot+Aop+注解实现Api接口签名验证)
前言 一个web系统,从接口的使用范围也可以分为对内和对外两种,对内的接口主要限于一些我们内部系统的调用,多是通过内网进行调用,往往不用考虑太复杂的鉴权操作。但是,对于对外的接口,我们就不得不重视这个…...
微服务-理论(CAP,一致性协议)
CAP理论 关于CAP理论的介绍可以直接看这篇文章 CAP分别是什么? 一致性(Consistency 一致性包括强一致性,弱一致性,最终一致性。 一致性其实是指数据的一致性,为什么数据会不一致呢? 如上面这张图&…...
CTFshow web入门web128-php特性31
开启环境: 一个新的姿势,当php扩展目录下有php_gettext.dll时: _()是一个函数。 _()gettext() 是gettext()的拓展函数,开启text扩展get_defined_vars — 返回由所有已定义变量所组成的数组。 call_user_func — 把第一个参数作为回调函数调…...
再见2023,你好2024(附新年烟花python实现)
亲爱的朋友们: 写点什么呢,我已经停更两个月了。2023年快结束了,时间真的过得好快,总要写点什么留下纪念吧。这一年伴随着许多挑战和机会,给了我无数的成长和体验。坦白说,有时候我觉得自己好像是在时间的…...
Redis 的常用命令
一、Redis 通用命令 TYPE key:返回 key 所储存的值的类型。 OBJECT ENCODING key:返回key所储存的值的底层编码方式。 DEL key:该命令用于在 key 存在时删除 key。 EXPIRE key seconds:设置指定key的过期时间。 RENAME key newke…...
【模拟电路】模拟集成电路之神-NE555
一、集成电路NE555简介 二、功能框图与引脚说明 三、比较器(运放) 四、反相门(非门) 五、或非门 六、双稳态触发器 七、NE555的工作原理 集成电路NE555的芯片手册 C5157696 一、集成电路NE555简介 NE555起源于上个世纪70年代&a…...
收集最新的 Sci-Hub 网址(本文章持续更新2024)
自用收集最新的 Sci-Hub 网址 本文章持续更新收集 Sci-Hub 的可用网址链接仅供交流学习使用,如对您有所帮助,请收藏并推荐给需要的朋友,由于网站限制,不一定所有网址都能在您所在的位置访问,通常情况下,一…...
针对NPC客户端的升级(脚本执行)
上一次我们使用NPS自动注册的方式,在被控端上实现了自动创建NPC客户端链接。 Linux主机自动注册NPS客户端(脚本化) 但是在使用过程中我发现存在很多的问题,如果被控端重启客户端或者出现了多个NPS时会造成冲突,所以考虑…...
[每周一更]-(第51期):Go的调度器GMP
参考文献 https://learnku.com/articles/41728http://go.cyub.vip/gmp/gmp-model.html#g-m-phttps://blog.csdn.net/ByteDanceTech/article/details/129292683https://www.ququ123.top/2022/04/golang_gmp_principle/ 什么是GMP? GMP模型是Go语言并发模型的核心概念&#x…...
阿里云和腾讯云服务器系统盘40G或50G空间够用吗?
云服务器系统盘40G或50G空间够用吗?够用,操作系统一般占用几个GB的存储空间,尤其是Linux操作系统占用空间容量更小,阿里云和腾讯云服务器系统盘默认提供的40GB高效云盘或50G通用型SSD云硬盘,阿腾云atengyun.com分享是否…...
网络层协议 ——— IP协议
文章目录 IP协议基本概念IP协议格式分片与组装网段划分特殊的IP地址IP地址的数量限制私网IP地址和公网IP地址路由路由表生成算法 IP协议 IP协议全称为“网际互连协议(Internet Protocol)”,IP协议是TCP/IP体系中的网络层协议。 基本概念 网…...
MATLAB --- interp1( )函数的用法
interp1() 是 MATLAB 中用于一维插值的函数, 它可以根据给定的数据点进行插值,从而在给定的插值点处估计函数的值 下面是 interp1() 函数的用法: Vq interp1(X, V, Xq) Vq interp1(X, V, Xq, method) Vq interp1(X, V, Xq, method, extr…...
【react-taro-canvas】用canvas手写一个数字、字母混合的行为验证码
用canvas手写一个数字、字母混合的行为验证码 实现效果源码 实现效果 源码 import Taro from "tarojs/taro"; import { View, Canvas, Input, Button } from "tarojs/components"; import { useState, useEffect } from "react"; // 画随机线函…...
ctfshow——信息搜集
文章目录 web 1web 2web 3web 4web 5web 6web 7web 8web 9web 10web 11web 12web 13web 14web 15web 16web 17web 18web 19web 20 web 1 题目提示开发注释未及时删除。 直接右键查看源代码。 web 2 在这关我们会发现:1)无法使用右键查看源代码&…...
【Linux驱动】设备树模型的LED驱动 | 查询方式的按键驱动
🐱作者:一只大喵咪1201 🐱专栏:《Linux驱动》 🔥格言:你只管努力,剩下的交给时间! 目录 🍮设备树模型的LED驱动🍩设备树文件🍩驱动程序 …...
GZ075 云计算应用赛题第4套
2023年全国职业院校技能大赛(高职组) “云计算应用”赛项赛卷4 某企业根据自身业务需求,实施数字化转型,规划和建设数字化平台,平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”,拟采用开源OpenSt…...
小型肉制品厂废水处理设备加工厂家
诸城市鑫淼环保小编带大家了解一下小型肉制品厂废水处理设备加工厂家 在小型肉制品厂,处理肉类加工废水是非常重要的环保问题。废水中含有蛋白质、脂肪、悬浮物和有机物等,需要进行合适的处理以减少对环境的污染。以下是一些常见的小型肉制品厂废水处理设…...
wordpress2017电脑版/你对网络营销的理解
Razor视图引擎中,使用部分视图编译报错 类型“System.Object”在未被引用的程序集中定义。必须添加对程序集“System.Runtime, Version4.0.0.0, Cultureneutral, PublicKeyTokenb03f5f7f11d50a3a”的引用 查找网上一些解决方案,在微软官网找到同样问题 最…...
网络营销平台搭建方案网站/网页广告调词平台多少钱
1. 概述 最近开始学习自定义View,看到现在公司项目上的一个动画效果,顿时想到其实可以自己画,于是就开始着手优(zhuang)化(bi)这个动画。 动画如下: 其实很简单对不对,但…...
深圳网站建设黄浦网络-骗子/图片百度搜索
第二章 第二章我学习的线性表,听名字就很抽象,所以自然很难学。但是学完之后才发现,这真的很难学!我们学习了顺序表和链表,从字面上就可以看出来,这两个表还是有区别的。这两种表都有各自的优缺点。 顺序表…...
大厂县建设局网站/站长工具是什么
很多电脑小白都不知道自己的电脑配置能玩那些游戏,然后就会在贴吧、百度知道、知乎等等网站上进行提问“我的电脑配置能玩那些游戏呢?”这种问题,然后就会得到各路大神的解答,有说你的配置不能玩的,同时也有有说你的配…...
wordpress 文章图片居中/下载班级优化大师
是在网上找到你一个方法,具体还没试用,改天有时间试用一下恢复被误删文件的方法大多数Linux发行版都提供一个debugfs工具,可以用来对Ext3文件系统进行编辑操作。不过在使用这个工具之前,还有一些工作要做。首先以只读方式重新挂载…...
网站建设代理商/网站运营主要做什么
我们肯定遇到过打开别人的项目时一直处于Building‘XXX’Gradle project info的情况。 然后就耐心等待了一会,然后就烦躁地再等待了一会,发现还没动静就果断点击了Cancel,但是发现并不能Cancel掉。最后只能强制结束掉AS。 事件的起因是别人项…...