最长子序列模型二(二分优化版)

news2024/12/24 0:18:47

文章目录

  • 提高课题解
    • 一、拦截导弹
    • 二、导弹防御系统
    • 三、最长公共上升子序列
    • 四、二分函数速写
  • 基础课题解
    • 五、最长上升子序列 II

提高课题解

一、拦截导弹

题目链接
在这里插入图片描述

第一问非常简单,直接用之前最长上身子序列模板就行
第二问就有难度了,我们要用最少的递减子序列覆盖这个数组,怎么样才最少呢?

把i这个位置放在在i位置之前的所有非递增子序列中的最后一个数大于等于第i个位置的数的非递增子序列,同时我们要放在所有大于等于i位置数的最小那一个的后面,这样才能保证i后面状态的位置能够有更多机会加入到前面的非递增子序列中,如果i这个状态都大于前面所有非递增子序列的最后一个数,那么我们要新开辟一个空间给i状态,因为它不满住前面所有的状态

图解:
在这里插入图片描述

在所有最后一个数大于等于i这个位置数的非递增子序列中,i这个位置的数一定要放在这些非递增子序列中最后一个数中最小的那个数?(这里要用贪心证明,证明见acwing彩色铅笔,我这里用个通俗的例子来说明)

见图:
在这里插入图片描述

二、导弹防御系统

题目链接
在这里插入图片描述

这个题也是经典的dp思想,运用dfs然后剪枝,你的第i个位置的状态要么放到递增子序列里面,要么放在递减子序列里面。

图解:为什么要恢复现场?
在这里插入图片描述

这里ans每次有一个结果出现也就是t == n的时候,每次都会更新一下ans(除非比ans小才会更新),ans维护的是所有状态的值,所以我们可以得到最小值

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 55;
int n;
int q[N];
int up[N], down[N];
int ans;

void dfs(int u,int d,int t)
{
    if(u + d >= ans) return;//如果某一个方案的u + d
    //大于等于之前已有方案的总个数
    //,那么把这个方案pass掉
    
    if(t == n)
    {
        if(ans > u + d) ans = u + d;//每次有比原有的最小方案小的方案,那么更新一下ans
        return;//更新完就返回
    }
    
    //两种策略,你这个数要么放在递增子序列里面,
    //要么放在递减子序列里面,这样就考虑比较全,不会漏掉某一个方案
    
    //如果你放在递增序列里面,这里默认up是递增子序列,因为每次你要加入新数的时候,
    //你要找所有小于新数的的数中最大的一个数,
    //这样能保证你后面新加的数有更多的机会放入up序列中
    //假设你放入的的是小于新数中最小的那一个数,
    //那么后面来了一个新数,比原来前面的新数把所有小于新数的的数中最小的一个数大
    //但是没有你倒数第二大的数小,那么你又重新开一个序列(这不是纯纯浪费了吗?)
    int i;
    for(i = 1;i <= u;i ++)
    if(up[i] < q[t]) break;
    
    int tmp = up[i];//记录原来的值,我们需要剪枝
    up[i] = q[t];
    dfs(max(u, i), d, t + 1);
    
    //恢复现场
    up[i] = tmp;
    
    int j;
    //这里我们要找的递减子序列,那么找的一定是所有递减子序列中最后一个数中,
    //大于加入的新数,
    //而且还要找递减子序列中大于新数的最小那个那个数,
    //这样才能让后面的数有更多的机会放入到递减子序列中
    //down默认是一个单剪序列
    for(j = 1;j <= d;j ++)
    if(down[j] > q[t]) break;
    int temp = down[j];
    down[j] = q[t];
    dfs(u, max(d, j), t + 1);
    
    //恢复现场
    down[j] = temp;
}

int main()
{
    while(cin >> n && n)
    {
        ans = 100;
        for(int i = 0;i < n;i ++)
        cin >> q[i];
        
        dfs(0, 0, 0);
        printf("%d\n", ans);
    }
    return 0;
}

在这里插入图片描述

三、最长公共上升子序列

题目链接
在这里插入图片描述
贴一下y总的题解

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 3010;
int n;
int f[N][N];
int a[N], b[N];

int main()
{
    cin >> n;
    for(int i = 1;i <= n;i ++) cin >> a[i];
    for(int i = 1;i <= n;i ++) cin >> b[i];
    
    //我们以b[j]元素为研究对象
    //a[i]和b[j]是否能够匹配上
    for(int i = 1;i <= n;i ++)
    {
        int rmax = 1;
        for(int j = 1;j <= n;j ++)
        {
            f[i][j] = f[i - 1][j];
            if(a[i] == b[j]) f[i][j] = max(f[i][j], rmax);
            if(a[i] > b[j]) rmax = max(rmax, f[i - 1][j] + 1);
        }
    }
    int res = 0;
    for(int i = 1;i <= n;i ++) res = max(res, f[n][i]);
    
    cout << res;
    return 0;
}

y总课程板书图解
在这里插入图片描述

在这里插入图片描述

四、二分函数速写

在这里插入图片描述

基础课题解

五、最长上升子序列 II

题目链接
在这里插入图片描述

这个题有时间限制时间复杂度必须满足nlogn

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 100010;

int n;
int a[N];
int q[N];

int main()
{
    scanf("%d", &n);
    for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]);

    int len = 0;
    for (int i = 0; i < n; i ++ )
    {
        int l = 0, r = len;
        while (l < r)
        {
            int mid = l + r + 1 >> 1;
            if (q[mid] < a[i]) l = mid;
            else r = mid - 1;
        }
        len = max(len, r + 1);
        q[r + 1] = a[i];
    }

    printf("%d\n", len);

    return 0;
}

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

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

相关文章

基于SSM“毛毛宠物店”宠物信息交流平台的设计与实现

开发说明 开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myec…

DEV-C++如何调试

1、先编译&#xff0c;再点击“调试”按钮 2、使用调试按钮&#xff0c;可以输入输出数据 第21次发博客 以后会慢慢更新

【计网】从零开始认识IP协议 --- 认识网络层,认识IP报头结构

从零开始认识IP协议 1 网络层协议1.1 初步认识IP协议1.2 初步理解IP地址 2 IP协议报头3 初步理解网段划分 1 网络层协议 1.1 初步认识IP协议 我们已经熟悉了传输层中的UDP和TCP协议&#xff0c;接下来我们来接触网络层的协议&#xff1a; 网络层在计算机网络中的意义主要体现…

EXCELL中如何两条线画入一张图中,标记坐标轴标题?

1&#xff0c;打开excel&#xff0c;左击选中两列&#xff0c; 2&#xff0c;菜单栏>“插入”>”二维折线图”选中一个 3&#xff0c;选中出现的两条线中的一条右击>最下一行&#xff0c;“设置数据系列格式” 4&#xff0c;右测“系列选项中”>点击“次坐标轴” 5…

Java 开发——(上篇)从零开始搭建后端基础项目 Spring Boot 3 + MybatisPlus

一、概述 记录时间 [2024-10-23] 本文是一个基于 Spring Boot 3 MybatisPlus 的项目实战开发&#xff0c;主要涵盖以下几个方面&#xff1a; 从零开始的项目创建IDEA 中开发环境的热部署Maven、Swagger3、MybatisPlus 等的配置路由映射知识静态资源访问文件上传功能实现拦截器…

颐驰06持续交付,明日科技赋能出行生活

在全球智能出行领域&#xff0c;自动驾驶技术的发展一直是行业关注的焦点。不久前&#xff0c;特斯拉发布的自动驾驶出租车引发了全球关注&#xff0c;但由于缺乏具体的技术细节&#xff0c;导致投资者信心受挫&#xff0c;特斯拉股票一度下跌近10%。与此同时&#xff0c;中国车…

智能台灯设计(一)原理图设计

1. 前言 作者最近突发奇想&#xff0c;想自己做一个小台灯&#xff0c;设想的功能有&#xff1a;带锂电池可充电、可以调节亮度&#xff0c;后续通过增加WIFI模块实现手机控制开关功能。目前先实现最简单的功能&#xff0c;有时间再一步步完善吧。 2. 原理图设计 充电芯片使用…

常用的三角公式

目录 1. 基本公式​ 2. 倍角公式​ 3. 半角公式​ 4. 和差公式​ 5. 和差化积​ 6. 积化和差​ 7. 万能公式​ 1. 基本公式 2. 倍角公式 3. 半角公式 4. 和差公式 5. 和差化积 6. 积化和差 7. 万能公式

self-supervised learning(BERT和GPT)

1芝麻街与NLP模型 我們接下來要講的主題呢叫做Self-Supervised Learning&#xff0c;在講self-supervised learning之前呢&#xff0c;就不能不介紹一下芝麻街&#xff0c;為什麼呢因為不知道為什麼self-supervised learning的模型都是以芝麻街的人物命名。 因為Bert是一個非常…

第九部分 Java API

第九部分 Java API 9.1 Java Number & Math 9.1.1 Java Number类 一般地&#xff0c;当需要使用数字的时候&#xff0c;我们通常使用内置数据类型&#xff0c;如&#xff1a;byte、int、long、double 等。 实例 int a 5000; float b 13.65f; byte c 0x4a;然而&…

《云原生安全攻防》-- K8s攻击案例:权限维持的攻击手法

在本节课程中&#xff0c;我们将一起深入了解K8s权限维持的攻击手法&#xff0c;通过研究这些攻击手法的技术细节&#xff0c;来更好地认识K8s权限维持所带来的安全风险。 在这个课程中&#xff0c;我们将学习以下内容&#xff1a; K8s权限维持&#xff1a;简单介绍K8s权限维持…

VUE中文本域默认展示最底部内容

文本域内容 <textarea ref"textareaRef" style"width: 100%; resize: none;" readonly v-model"errorLog" rows"15"></textarea> 样式展示 this.$nextTick(() > { // 使用$refs获取文本域的DOM元素 const textareaInfo…

SwiftUI:单个App支持设置多语言

SwiftUI 全新多语言方案 简化本地化的字符串- WWDC21 - 视频 本地化您的SwiftUI app - WWDC21 - 视频 构建全球化App&#xff1a;本地化的示例- WWDC22 - 视频 构建支持多语言的App - WWDC24 - 视频 单个App支持设置多语言 工程 Info.plist里添加 键值UIPrefersShowingLangua…

解析三相220V与三相380V变频器的关键差异

在工业自动化的广阔舞台上&#xff0c;作为电力电子技术的杰出代表&#xff0c;扮演着调节电机速度、优化能源利用的重要角色。本文将深入探讨三相220V与三相380V变频器之间的九大核心区别&#xff0c;帮助读者更全面地理解这两种设备的应用特性。 一、电压等级&#xff1a;基础…

【C#】调用本机AI大模型流式返回

【python】AI Navigator的使用及搭建本机大模型_anaconda ai navigator-CSDN博客 【Python】AI Navigator对话流式输出_python ai流式返回-CSDN博客 前两章节我们讲解了使用AI Navigator软件搭建本机大模型&#xff0c;并使用python对大模型api进行调用&#xff0c;使其流式返…

【线下培训】龙信科技应邀参与了由教育部网络安全与执法虚拟教研室(中国刑事警察学院)举办的学术讲座

文章关键词&#xff1a;电子数据取证培训、产学研推进、手机取证、介质取证 2024年10月23日&#xff0c;龙信科技应邀参与了由教育部网络安全与执法虚拟教研室&#xff08;中国刑事警察学院&#xff09;举办的学术讲座。在这次学术交流中&#xff0c;我们公司的技术专家陈杰以…

使用.NET MAUI开发第一个安卓APP

它是.NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架&#xff0c;用于使用 C# 和 XAML 创建本机移动和桌面应用。 .NET MAUI可从单个共享代码库开发可在 Android、iOS、macOS 和 Windows 上运行的应用。 使用 .NET MAUI 开发第一个 Android 应用是一个直观的过程&#xff0c;…

【C++初阶】一文讲通C++内存管理

文章目录 1. C/C内存分布2. C语言中动态内存管理方式3. C内存管理方式3. 1 new/delete操作内置类型3. 2 new和delete操作自定义类型 4. new与delete的原理4. 1 operator new与operator delete函数4. 2 内置类型4. 3 自定义类型 5. 定位new表达式(placement-new)6. malloc/free和…

苍穹外卖--开发记录day09-10

目录 苍穹外卖day09-10一&#xff1a;springtask二&#xff1a;订单状态定时处理三&#xff1a;websocket四&#xff1a;来单提醒五&#xff1a;客户催单 总结 苍穹外卖day09-10 首先第九天是实战日&#xff0c;要完成以下内容的开发&#xff1a; 用户端历史订单模块&#xf…

Python小游戏13——植物大战僵尸

代码 import random import time # 植物类 class Plant: def __init__(self, name, health): self.name name self.health health def is_alive(self): return self.health > 0 # 僵尸类 class Zombie: def __init__(self, name, health): self.name name self.health h…