当前位置: 首页 > news >正文

【[CSP-J 2022] 上升点列】

题目

[CSP-J 2022] 上升点列
题目描述
在一个二维平面内,给定 n 个整数点 (x i ,y i​ ),此外你还可以自由添加 k 个整数点。
你在自由添加 k 个点后,还需要从 n+k 个点中选出若干个整数点并组成一个序列,使得序列中任意相邻两点间的欧几里得距离恰好为 1 而且横坐标、纵坐标值均单调不减,即 x i+1 −x i =1,y i+1 =y i 或 y i+1 −y i =1,x i+1 =x i 。请给出满足条件的序列的最大长度。

输入格式
第一行两个正整数 n,k 分别表示给定的整点个数、可自由添加的整点个数。接下来 n 行,第 i 行两个正整数 x i ,y 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

思路

1.各点按x、y排序
2.状态:到达各点的最多序列
3.状态转移:到达该点的最多序列=前面所有点中的最多序列
4.转移方程:f[i][n]=max(f[i][n],f[j][k-dis(i,j)]+dis(i,j)+1)
f[当前点][借的点数]=max(f[当前点][借的点数],
f[当前点前的每个点][当前借的点数-i到j两点间需要的点数]
+
i到j两点间需要的点数
+
i点本身
)
5.三层循环
一层,遍历每个点(i)
二层,遍历i前所有点(j)
三层,遍历能借的点数0到k-dis(i,j)

图解

在这里插入图片描述

两点间欧几里得距离

在这里插入图片描述

代码

#include <bits/stdc++.h>
using namespace std;
int n,//整数点数 k,//可添加整数点数 x,y,//整数点的坐标 ans,//最多序列 f[501][101];//在借得不同数点情况下到达每个点的最多序列数 //f[i][x]=max(f[i][x],f[j][x-dis(i,j)]+dis(i,j)+1) 
struct point{int x,y;bool operator<(const point p2)const{if(x==p2.x)return y<p2.y;return x<p2.x;}
}p[501];
int dis(int i2,int i1){return p[i1].x-p[i2].x+p[i1].y-p[i2].y-1;
}
void view(){cout<<"各点"<<endl;for(int i=0;i<n;i++)cout<<p[i].x<<","<<p[i].y<<endl;
}
void view2(){cout<<"最多序列"<<endl;cout<<"添加\t";for(int x=0;x<=k;x++)cout<<x<<'\t';cout<<endl;	for(int i=0;i<n;i++){cout<<p[i].x<<","<<p[i].y<<"\t";for(int x=0;x<=k;x++)cout<<f[i][x]<<'\t';cout<<endl;	}}
int main(){freopen("point.in","r",stdin);cin>>n>>k;for(int i=0;i<n;i++){cin>>x>>y;p[i]=point{x,y}; }//view();sort(p,p+n);view();for(int i=0;i<n;i++){//遍历所有点 f[i][0]=1;//初始化,每个点序列起码有1 for(int j=0;j<i;j++)//遍历前面的所有点 if(p[j].y<=p[i].y){//如果是升序(右上) int m=dis(j,i);//欧几里得距离 for(int x=0;x+m<=k;x++)//j已经加的点+现在i到j加的点不超过k f[i][x+m]=max(f[i][x+m],f[j][x]+dis(j,i)+1);/*第i点用了x+m个点后的最多序列=以下中最大本来的最多序列i前j点用了x个点后的最多序列,加上i到j需要的点,+i点本身 */	}	}view2();for(int i=0;i<n;i++)//遍历所有点,不一定是最后一个序列最多 for(int j=0;j<=k;j++)//用添加点最少而序列最多的 ans=max(ans,f[i][j]+k-j);//在必须用的点基础上还可以用k剩余的点 cout<<ans;return 0;
}

数据

在这里插入图片描述

http://www.dtcms.com/a/307916.html

相关文章:

  • Dockerfile详解
  • “人工智能+政务服务”辅助审批项目需求及方案
  • 上传文件到服务器
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-53,(知识点:硬件电路问题排查,CPU上电后未运转,供电、时钟,复位,硬件连接)
  • 将本地项目关联并推送到已有的 GitHub 仓库
  • UE5多人MOBA+GAS 番外篇:同时造成多种类型伤害
  • 虚幻引擎5 GAS开发俯视角RPG游戏 #06-11:游戏后效果执行
  • 关于AR地产发展现状的深度探究​
  • AR智能巡检:制造业运维效率提升的关键
  • 提示词增强工程(Prompt Enhancement Engineering)白皮书草稿
  • AR-Align-NN-2024
  • 一个轻量级、无依赖的 Loading 插件 —— @lijixuan/loading
  • 常用设计模式系列(十七)—命令模式
  • 一天两道力扣(7)
  • 第1章:基础篇——第1节:基础操作与认识界面
  • 每日算法刷题Day56:7.31:leetcode 栈6道题,用时2h30min
  • 使用python写一套完整的智能体小程序
  • BasicAuthenticationFilter处理 HTTP 基本认证(Basic Authentication)的核心过滤器详解
  • python逻辑回归:数学原理到实战应用
  • 逻辑回归详解:从数学原理到实际应用
  • 界面组件DevExpress WPF中文教程:网格视图数据布局 - 数据单元格
  • CentOS7 使用Docker安装MinIO完整教程
  • 使用ANSYS在系统级对降压转换器进行建模
  • 在超算平台异构加速卡AI * 1卡的Ubuntu20.04环境下安装docker服务(未成功)
  • 本土DevOps平台Gitee如何重塑中国研发团队的工作流
  • 为Github Copilot创建自定义指令/说明/注意事项
  • 计算机网络中的socket是什么?编程语言中的socket编程又是什么?python的socket编程又该如何用?
  • 浅谈“压敏电阻”
  • Kubernetes (K8s) 部署Doris
  • 智慧城市多源监控协同精度↑28%:陌讯多模态融合算法实战解析