【题解】【动态规划,最长上升子序列LIS】—— [CSP-J 2022] 上升点列

news2024/11/24 12:56:20

【题解】【动态规划,最长上升子序列LIS】—— [CSP-J 2022] 上升点列

  • [CSP-J 2022] 上升点列
    • 题目描述
    • 输入格式
    • 输出格式
    • 输入输出样例
      • 输入 #1
      • 输出 #1
      • 输入 #2
      • 输出 #2
    • 提示
  • 1.题意解析
  • 2.AC代码

[CSP-J 2022] 上升点列

通往洛谷的传送门

题目描述

在一个二维平面内,给定 n n n 个整数点 ( x i , y i ) (x_i, y_i) (xi,yi),此外你还可以自由添加 k k k 个整数点。

你在自由添加 k k k 个点后,还需要从 n + k n + k n+k 个点中选出若干个整数点并组成一个序列,使得序列中任意相邻两点间的欧几里得距离恰好为 1 1 1 而且横坐标、纵坐标值均单调不减,即 x i + 1 − x i = 1 , y i + 1 = y i x_{i+1} - x_i = 1, y_{i+1} = y_i xi+1xi=1,yi+1=yi y i + 1 − y i = 1 , x i + 1 = x i y_{i+1} - y_i = 1, x_{i+1} = x_i yi+1yi=1,xi+1=xi。请给出满足条件的序列的最大长度。

输入格式

第一行两个正整数 n , k n, k n,k 分别表示给定的整点个数、可自由添加的整点个数。

接下来 n n n 行,第 i i i 行两个正整数 x i , y i x_i, y_i xi,yi 表示给定的第 i i i 个点的横纵坐标。

输出格式

输出一个整数表示满足要求的序列的最大长度。

输入输出样例

输入 #1

8 2
3 1
3 2
3 3
3 6
1 2
2 2
5 5
5 3

输出 #1

8

输入 #2

4 100
10 10
15 25
20 20
30 30

输出 #2

103

提示

【样例 #3】

见附件中的 point/point3.inpoint/point3.ans

第三个样例满足 k = 0 k = 0 k=0

【样例 #4】

见附件中的 point/point4.inpoint/point4.ans

【数据范围】

保证对于所有数据满足: 1 ≤ n ≤ 500 1 \leq n \leq 500 1n500 0 ≤ k ≤ 100 0 \leq k \leq 100 0k100。对于所有给定的整点,其横纵坐标 1 ≤ x i , y i ≤ 10 9 1 \leq x_i, y_i \leq {10}^9 1xi,yi109,且保证所有给定的点互不重合。对于自由添加的整点,其横纵坐标不受限制。

测试点编号 n ≤ n \leq n k ≤ k \leq k x i , y i ≤ x_i,y_i \leq xi,yi
1 ∼ 2 1 \sim 2 12 10 10 10 0 0 0 10 10 10
3 ∼ 4 3 \sim 4 34 10 10 10 100 100 100 100 100 100
5 ∼ 7 5 \sim 7 57 500 500 500 0 0 0 100 100 100
8 ∼ 10 8 \sim 10 810 500 500 500 0 0 0 10 9 {10}^9 109
11 ∼ 15 11 \sim 15 1115 500 500 500 100 100 100 100 100 100
16 ∼ 20 16 \sim 20 1620 500 500 500 100 100 100 10 9 {10}^9 109

1.题意解析

    只需要看一眼就知道只是一道 d p dp dp模版题。

    这道题就是最长上升子序列的升级版,不知道的请移步这里。

    首先动态规划五步走

1.抽象问题:求“最长不下降子序列”的长度。

    下图就提供了一个“不下降子序列”的示例。请尝试结合题目理解。
在这里插入图片描述

2.状态:dp[i][j]代表以第 i i i个点结尾增加 j j j个点的“最长不下降子序列”的长度。

    根据问题的定义来定义就行了。

3.初始条件:dp[i][j]=j+1 i ∈ [ 1 , n ] i\in[1,n] i[1,n] j ∈ [ 0 , k ] j\in[0,k] j[0,k]

    容易知道,想要让 d p [ i ] [ j ] dp[i][j] dp[i][j]尽量的大,最直接的方法就是在前面直接加上j个点。再加上当前点,得到初始状态j+1

4,状态转移方程:dp[i][p]=max(dp[i][p],dp[j][p-add]+add+1)
    其中: i ∈ [ 2 , n ] i\in[2,n] i[2,n] j ∈ [ 1 , i − 1 ] j\in[1,i-1] j[1,i1] p ∈ [ a d d , k ] p\in[add,k] p[add,k]
    add代表由点 i i i到点 j j j需要添加的点的个数

    看完后是不是一头雾水?

    根据LIS中对方程的推导,可以发现,以第 i i i个点结尾的序列的最长长度就是前面能接上的所有点的最长长度 + 1 +1 +1

    因此,对于每一个点 i i i。直接枚举前面的所有点 j j j。如果能接得上(即保证add<ka[j].y<a[i].y(即能通过增加点使得 a [ j ] . y = a [ i ] . y a[j].y=a[i].y a[j].y=a[i].y))。

    然后更新每一个 a [ i ] [ p ] a[i][p] a[i][p]。因为前面我们已经增加了add个点了。所以p要从add开始枚举到k。这个时候,我们只剩下p-add个点了。类似于LIS,我们只需要让a[i][p]对每一个a[j][p-add]+1取最大值就行了。但直接这样写是错的。还记得这个条件的前提吗?没错,我们已经增加了 a d d add add个点。所以应该对每一个a[j][p-add]+add+1取最大值。

    最后,对于add可以这样计算:add=a[i].x-a[j].x+a[i].y-a[j].y-1;,这里先卖个关子。请读者自行思考。

2.AC代码

#include<bits/stdc++.h>
using namespace std;
#define MAXN 510
int n,k,ans,dp[MAXN][MAXN];//dp[i][j]表示在i前面增加j个点的最大序列长度 
struct dote//储存每个点的坐标 
{
	int x,y;
}a[MAXN];
bool cmp(dote a,dote b)//排序 
{
	if(a.x==b.x)return a.y<b.y;
    return a.x<b.x;
}
int main()
{
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].y);
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;i++)//初始化 
        for(int j=0;j<=k;j++)//想要初始让dp[i][j]尽可能大,直接添加j个点
            dp[i][j]=j+1;
    for(int i=2;i<=n;i++)//从第2个点开始枚举
        for(int j=i-1;j>=1;j--)//枚举前面的每一个点
        {
        	//计算需要到达此点最少需要添加的点数
        	int add=a[i].x-a[j].x+a[i].y-a[j].y-1;
        	if(add>k||a[i].y<a[j].y)continue;//不符合条件
        	for(int p=add;p<=k;p++)//分别枚举一共添加从add到k个点
        	    dp[i][p]=max(dp[i][p],dp[j][p-add]+add+1);//状态转移方程
		}
	for(int i=1;i<=n;i++)//取每一个数的最大值
	    ans=max(ans,dp[i][k]);
	printf("%d",ans);
	return 0;
}

喜欢就订阅此专辑吧!

【蓝胖子编程教育简介】
蓝胖子编程教育,是一家面向青少年的编程教育平台。平台为全国青少年提供最专业的编程教育服务,包括提供最新最详细的编程相关资讯、最专业的竞赛指导、最合理的课程规划等。本平台利用趣味性和互动性强的教学方式,旨在激发孩子们对编程的兴趣,培养他们的逻辑思维能力和创造力,让孩子们在轻松愉快的氛围中掌握编程知识,为未来科技人才的培养奠定坚实基础。

欢迎扫码关注蓝胖子编程教育
在这里插入图片描述

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

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

相关文章

GAMES101(19节,相机)

相机 synthesis合成成像&#xff1a;比如光栅化&#xff0c;光线追踪&#xff0c;相机是capture捕捉成像&#xff0c; 但是在合成渲染时&#xff0c;有时也会模拟捕捉成像方式&#xff08;包括一些技术 动态模糊 / 景深等&#xff09;&#xff0c;这时会有涉及很多专有名词&a…

确保接口安全:六大方案有效解决幂等性问题

文章目录 六大方案解决接口幂等问题什么是接口幂等&#xff1f;天然幂等不做幂等会怎么样&#xff1f; 解决方案1&#xff09;insert前先select2&#xff09;使用唯一索引3&#xff09;去重表加悲观锁4&#xff09;加乐观锁之版本号机制5&#xff09;使用 Redisson 分布式锁6&a…

银河麒麟系统内存清理

银河麒麟系统内存清理 1、操作步骤2、注意事项 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 当银河麒麟系统运行较长时间&#xff0c;内存中的缓存可能会积累过多&#xff0c;影响系统性能。此时&#xff0c;你可以通过简单的命令来清理这…

问:LINUXWINDOWS线程CPU时间如何排序?

Linux 在Linux上&#xff0c;你可以使用ps命令结合sort命令来查看和排序进程或线程的CPU使用时间。 查看进程的CPU使用时间并按时间排序 使用ps命令的-o选项可以自定义输出格式&#xff0c;-e选项表示显示所有进程&#xff0c;--sort选项用于排序。 ps -e -o pid,tid,comm,…

排序大全(干货)

目录 1. 插入排序步骤&#xff1a; 2.选择排序思路&#xff1a;每次从待排序列中选出一个最小值&#xff0c;然后放在序列的起始位置&#xff0c;直到全部待排数据排完即可。实际上&#xff0c;我们可以一趟选出两个值&#xff0c;一个最大值一个最小值&#xff0c;然后将其放…

【springboot】整合LoadBalancer

目录 问题产生背景解决方案&#xff1a;实现LoadBalancer1. 添加依赖2. 配置文件3. 使用LoadBalancer4. 使用 RestTemplate 进行服务调用5. 测试 问题产生背景 以下是一个购物车项目&#xff0c;通过调用外部接口获取商品信息&#xff0c;并添加到购物车中&#xff0c;这段代码…

如何使用ssm实现中学生课后服务的信息管理与推荐+vue

TOC ssm766中学生课后服务的信息管理与推荐vue 第一章 绪论 1.1 选题背景 目前整个社会发展的速度&#xff0c;严重依赖于互联网&#xff0c;如果没有了互联网的存在&#xff0c;市场可能会一蹶不振&#xff0c;严重影响经济的发展水平&#xff0c;影响人们的生活质量。计算…

查缺补漏----I/O中断处理过程

中断优先级包括响应优先级和处理优先级&#xff0c;响应优先级由硬件线路或查询程序的查询顺序决定&#xff0c;不可动态改变。处理优先级可利用中断屏蔽技术动态调整&#xff0c;以实现多重中断。下面来看他们如何运用在中断处理过程中&#xff1a; 中断控制器位于CPU和外设之…

SpringBoot开发:古典舞在线交流平台的架构与实现

第三章 系统分析 3.1 可行性分析 需要使用大部分精力开发的古典舞在线交流平台为了充分降低开发风险&#xff0c;特意在开发之前进行可行性分析这个验证系统开发是否可行的步骤。本文就会从技术角度&#xff0c;经济角度&#xff0c;还有操作角度等进行综合阐述。 3.1.1技术可行…

排序01 多目标模型

引入 使用机器学习方法对指标做预估&#xff0c;再对预估分数做融合。融合方法&#xff1a;加权和方法给不同指标赋予不同的权重&#xff0c;权重是做A/B test调试得到的。还有更好地融合方法。 多目标模型 排序模型的输入是各种各样的特征&#xff0c;用户特征主要是用户id和…

易趋(EasyTrack)资深顾问唐颖受邀为第四届中国项目经理大会演讲嘉宾

全国项目经理专业人士年度盛会 易趋&#xff08;EasyTrack&#xff09;资深顾问唐颖女士受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾&#xff0c;演讲议题为“隐形翅膀——数字化项目管理助力项目经理鹏程万里”。大会将于10月26-…

古典舞在线互动:SpringBoot平台设计与功能实现

第三章 系统分析 3.1 可行性分析 需要使用大部分精力开发的古典舞在线交流平台为了充分降低开发风险&#xff0c;特意在开发之前进行可行性分析这个验证系统开发是否可行的步骤。本文就会从技术角度&#xff0c;经济角度&#xff0c;还有操作角度等进行综合阐述。 3.1.1技术可行…

Prometheus之Pushgateway使用

Pushgateway属于整个架构图的这一部分 The Pushgateway is an intermediary service which allows you to push metrics from jobs which cannot be scraped. The Prometheus Pushgateway exists to allow ephemeral and batch jobs to expose their metrics to Prometheus. S…

扩散引导语言建模(DGLM):一种可控且高效的AI对齐方法

随着大型语言模型(LLMs)的迅速普及,如何有效地引导它们生成安全、适合特定应用和目标受众的内容成为一个关键挑战。例如,我们可能希望语言模型在与幼儿园孩子互动时使用不同的语言,或在撰写喜剧小品、提供法律支持或总结新闻文章时采用不同的风格。 目前,最成功的LLM范式是训练…

使用python基于DeepLabv3实现对图片进行语义分割

DeepLabv3 介绍 DeepLabv3 是一种先进的语义分割模型&#xff0c;由 Google Research 团队提出。它在 DeepLab 系列模型的基础上进行了改进&#xff0c;旨在提高图像中像素级分类的准确性。以下是 DeepLabv3 的详细介绍&#xff1a; 概述DeepLabv3 是 DeepLab 系列中的第三代…

无人机控制和飞行、路径规划技术分析

无人机控制和飞行、路径规划技术是现代无人机技术的核心组成部分&#xff0c;它们共同决定了无人机的性能和应用范围。以下是对这些技术的详细分析&#xff1a; 一、无人机控制技术 无人机控制技术主要涉及飞行控制系统的设计、传感器数据的处理以及指令的发送与执行。飞行控…

新闻推荐系统开发:Spring Boot实践指南

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常适…

厂商资源分享网站

新华三&#xff08;H3C&#xff09;是一家中国知名的网络设备供应商&#xff0c;提供网络设备、网络解决方案和云计算服务。公司成立于2003年&#xff0c;是华为公司和惠普公司合资的企业&#xff0c;总部位于中国深圳。 华为&#xff08;Huawei&#xff09;是一家全球知名的电…

本地运行LLama 3.2的三种方法

大型语言模型&#xff08;LLMs&#xff09;已经彻底改变了AI领域&#xff0c;小型模型也在崛起。因此&#xff0c;即使是在旧的PC和智能手机上运行先进的LLMs也成为了可能。为了给大家一个起点&#xff0c;我们将探索三种不同的方法来本地与LLama 3.2进行交互。 先决条件 在我…

【2022工业3D异常检测文献】AST: 基于归一化流的双射性产生不对称学生-教师异常检测方法

Asymmetric Student-Teacher Networks for Industrial Anomaly Detection 1、Background 所谓的学生-教师网络&#xff0c;首先&#xff0c;对教师进行训练&#xff0c;以学习语义嵌入的辅助性训练任务&#xff1b;其次&#xff0c;训练学生以匹配教师的输出。主要目的是让学生…