动态规划专项---最长上升子序列模型

news/2025/2/13 15:49:53/


文章目录

  • 怪盗基德的滑翔翼
  • 登山
  • 合唱队形
  • 友好城市
  • 最大上升子序列和
  • 拦截导弹
  • 导弹防御系统
  • 最长公共上升子序列

一、怪盗基德的滑翔翼OJ链接

       本题思路:本题是上升子序列模型中比较简单的模型,分别是从前往后和从后往前走一遍LIS即可。

#include <bits/stdc++.h>constexpr int N=110;int n;
int h[N];
int f[N];int main()
{std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);int T;std::cin>>T;while(T--){std::cin>>n;for(int i=1;i<=n;i++) std::cin>>h[i];int res=0;//正向求解LIS问题for(int i=1;i<=n;i++){f[i]=1;for(int j=1;j<i;j++)if(h[j]<h[i]) f[i]=std::max(f[i],f[j]+1);res=std::max(f[i],res);}memset(f,0,sizeof f);//这里需要将此时的f数组进行清零处理//反向求解LIS问题for(int i=n;i>=1;i--){f[i]=1;for(int j=n;j>i;j--)if(h[j]<h[i]) f[i]=std::max(f[i],f[j]+1);res=std::max(f[i],res);}std::cout<<res<<std::endl;}return 0;
}

二、登山OJ链接

        本题思路:状态表示f[i]表示以第 i个位置作为当前子序列的右端点的值,g[i]表示以第 i
个位置作为当前子序列的左端点的值。状态属性:f[i]求最长上升子序列的最多景点个数,g[i]求最长下降子序列的最多景点个数。状态计算:f[i]=max(f[i],f[j]+1)(1≤j<i≤n),g[i]=max(g[i],g[j]+1)(1≤i<j≤n)
求新数组最长上升子序列就是求原数组最长下降子序列答案表示:根据每一个点来划分:ans=max(包含 i的最长上升子序列 + 包含 i的最长下降子序列)所以 ans=max(f[i]+g[i]−1)。

#include <bits/stdc++.h>constexpr int N=1010;int n;
int h[N];
int f[N],g[N];//f用来表示上升子序列 g表示下降子序列int main()
{std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);std::cin>>n;for(int i=1;i<=n;i++) std::cin>>h[i];for(int i=1;i<=n;i++){//求出上升子序列f[i]=1;for(int j=1;j<i;j++)if(h[j]<h[i])f[i]=std::max(f[i],f[j]+1);}for(int i=n;i>=1;i--){//求出下降子序列g[i]=1;for(int j=n;j>i;j--)if(h[j]<h[i])g[i]=std::max(g[i],g[j]+1);}int res=0;for(int i=1;i<=n;i++)res=std::max(res,f[i]+g[i]-1);std::cout<<res<<std::endl;return 0;
}

三、合唱队形OJ链接

        本题思路:本题与上面一题差不多。

#include <bits/stdc++.h>constexpr int N=1010;int n;
int h[N];
int f[N],g[N];int main()
{std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);std::cin>>n;for(int i=1;i<=n;i++) std::cin>>h[i];for(int i=1;i<=n;i++){f[i]=1;for(int j=1;j<i;j++)if(h[j]<h[i])f[i]=std::max(f[i],f[j]+1);}for(int i=n;i>=1;i--){g[i]=1;for(int j=n;j>i;j--)if(h[j]<h[i])g[i]=std::max(g[i],g[j]+1);}int res=0;for(int i=1;i<=n;i++) res=std::max(res,f[i]+g[i]-1);std::cout<<n-res<<std::endl;return 0;
}

四、友好城市OJ链接

        本题思路:这里的我们可以先想想交叉和不交叉的情况下分别画出来的图是什么样子的。我们可以发现,在两座桥不交叉的情况下,有a1<a2,b1<b2,在两座桥相交的情况下,有a1<a2,b2<b1所以我们可以发现两桥是否交叉是可以用北岸城市编号的大小关系给反应出来的。所以我们的思路就可以转化为以南岸的城市编号为基准,把所有的城市对从小到大排序,从而得到关于北岸城市的一个数组。因为当bi<bj时能成功建一座桥,所以问题就转化成了求取这个数组的最长上升子序列。到此,我们对北方城市的数组做一次 LIS就可以得到答案了。

#include <bits/stdc++.h>#define x first
#define y secondtypedef std::pair<int, int> PII;
constexpr int N=5010;int n;
int f[N];
PII line[N];int main()
{std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);std::cin>>n;for(int i=1;i<=n;i++)std::cin>>line[i].x>>line[i].y;std::sort(line+1,line+n+1);int res=0;for(int i=1;i<=n;i++){for(int j=0;j<i;j++)if(line[j].y<line[i].y)f[i]=std::max(f[i],f[j]+1);res=std::max(res,f[i]);}std::cout<<res<<std::endl;return 0;
}

五、最大上升子序列和OJ链接

六、拦截导弹OJ链接

七、导弹防御系统OJ链接

八、最长公共上升子序列OJ链接


http://www.ppmy.cn/news/1228419.html

相关文章

Django自动生成docs接口文档

1.创建Django项目 python manage.py startproject django20252.创建子应用 python manage.py startapp api3.安装依赖包 pip install coreapi4.创建urls.py from django.contrib import admin from django.urls import path, include from rest_framework import routers f…

算法——动态规划(新)

什么是动态规划&#xff1f; 动态规划算法的基本思想-求解步骤-基本要素和一些经典的动态规划问题【干货】-CSDN博客 一、三步问题 面试题 08.01. 三步问题 - 力扣&#xff08;LeetCode&#xff09; 思路 我们要知道&#xff0c;走楼梯&#xff0c;前三个阶梯步数已经知道&…

leetcode面试经典150题——29 三数之和

题目&#xff1a;盛最多水的容器 描述&#xff1a; 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意…

c语言-输入输出详解

文章目录 格式化输入输出占位符printfscanf 字符串输入输出puts&#xff08;&#xff09;gets&#xff08;&#xff09; 字符输入输出putchar&#xff08;&#xff09;getchar&#xff08;&#xff09; 区别 格式化输入输出 输入输出的库函数的头文件&#xff1a; #include<…

辅助笔记-Jupyter Notebook的安装和使用

辅助笔记-Jupyter Notebook的安装和使用 文章目录 辅助笔记-Jupyter Notebook的安装和使用1. 安装Anaconda2. conda更换清华源3. Jupter Notebooks 使用技巧 笔记主要参考B站视频“最易上手的Python环境配置——Jupyter Notebook使用精讲”。 Jupyter Notebook (此前被称为IPyt…

单张图像3D重建:原理与PyTorch实现

近年来&#xff0c;深度学习&#xff08;DL&#xff09;在解决图像分类、目标检测、语义分割等 2D 图像任务方面表现出了出色的能力。DL 也不例外&#xff0c;在将其应用于 3D 图形问题方面也取得了巨大进展。 在这篇文章中&#xff0c;我们将探讨最近将深度学习扩展到单图像 3…

【Python大数据笔记_day09_hive函数和调优】

hive函数 函数分类标准[重点] 原生分类标准: 内置函数 和 用户定义函数(UDF,UDAF,UDTF) ​ 分类标准扩大化: 本来&#xff0c;UDF 、UDAF、UDTF这3个标准是针对用户自定义函数分类的&#xff1b; 但是&#xff0c;现在可以将这个分类标准扩大到hive中所有的函数&#xff0c;…

深入理解注意力机制(下)——缩放点积注意力及示例

一、介绍 在这篇文章中&#xff0c;我们将重点介绍 Transformer 背后的 Scaled Dot-Product Attention&#xff0c;并详细解释其计算逻辑和设计原理。 在文章的最后&#xff0c;我们还会提供一个Attention的使用示例&#xff0c;希望读者看完后能够对Attention有更全面的了解。…