P8816 [CSP-J 2022] 上升点列
Problem
考察算法:\(DP\)。
题目简述
给你 \(n\) 个点,每个点有一个坐标 \((x_i,y_i)\),还可以添加 \(k\) 个点。
添加之后,求:最长的上升点列的长度。
上升点列定义(两个点满足其中之一即可):
- \(x_{i+1}-x_{i} = 1,y_i = y_{i + 1}\)
- \(y_{i+1} - y_{i} = 1,x_i = x_{i + 1}\)
思路
设二维数组 \(f[i][j]\) 表示以第 \(i\) 个坐标结尾,增加 \(j\) 个点后最长上升点列的长度。
边界条件
如果每个点不和其他任何点连接,添加 \(j\) 个点后,上升点列的长度也最少是 \(j + 1\)。
注意:\(j\) 的循环范围是 \(0 \to k\)。
$ f[i][j] = j + 1$。
状态转移方程设计
设变量 \(t\) 为当前枚举到的左下方的点(状态的转移只能来自左下方),变量 \(c\) 为如果要连接 \(i\) 点和 \(t\) 点,最少要添加多少个点。
变量 \(c\) 如何计算:曼哈顿距离。\(c = (x_i-x_t) + (y_i - y_t) - 1\)。
所以:\(f_{i,j} = \max(f_{i,j}, f_{t,j - c} + c + 1)\)
因为如果要添加 \(c\) 个点,\(t\) 点只能添加 \(j - c\) 个点,然后加上添加的 \(c\) 个点再加一,就能得到上升点列的长度。
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 510;
struct node{
int x, y;
} a[N];
int n, k, f[N][N];
bool cmp(node n1, node n2) {
return n1.x < n2.x || (n1.x == n2.x && n1.y < n2.y);
}
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++) {
f[i][j] = j + 1;
}
}
int c;
for (int i = 2; i <= n; i++) {
for (int t = 1; t < i; t++) {
if (a[t].y > a[i].y) continue;
c = a[i].x - a[t].x + a[i].y - a[t].y - 1;
for (int j = c; j <= k; j++)
f[i][j] = max(f[i][j], f[t][j - c] + c + 1);
}
}
int ans = 0;
for (int i = 1; i <= n; i++) ans = max(ans, f[i][k]);
printf("%d", ans);
return 0;
}
P8816 [CSP-J 2022] 上升点列的更多相关文章
- CSP J/S 初赛总结
CSP J/S 初赛总结 2021/9/19 19:29 用官方答案估计 J 涂卡的时候唯一的一支 2B 铅笔坏了,只能用笔芯一个个涂 选择 \(-6\ pts\) 判断 \(-3\ pts\) 回答 ...
- 【游记】CSP J/S 2019 游记
J 组 \(2:30\)开始, \(2:13\)还在酒店的我看了看手表...飞奔考场. T1 数字游戏 秒切. 下午某中学某大佬说可用线性基(%) T2 公交换乘 用单调队列思想,秒切. T3 纪念品 ...
- CSP/S 2022 游寄
初赛 HN 初赛分数线好像大 \(32\) 分左右,通过率极高!本人弱弱的拿了 \(60.5\) 分(周围的同学平均分 \(>80\).) Day -1 这一天晚上,我背了背 dijkstra, ...
- 2019 CSP J/S第2轮 视频与题解
CSP入门组和提高组第二轮题解 转自网络
- CSP J/S 2019受虐记
一枚蒟蒻的游记~ 提高组DAY1 不是说每场考试都有一道签到题吗 那我tm读了三遍题硬是没找到一道水题是怎么回事(是我太弱了吗) 没办法,硬着头皮做T1 暴力写法...期望得分30pts 于是...在 ...
- [ 赛后总结 ] CSP-J 2022
前言 今年没考好,估分 100+60+0+10=170pts ,大概能混个2=,没什么用. 这下好了,期中也砸了,已经排到全校 30 开外了,果然鱼和熊掌不可兼得,况且我双双落空,接下来怕是想搞也搞不 ...
- 2022 CSP-J 游记
Day − ∞ -\infty −∞ 在家里跟父母约定 "只要csp-j一等奖,手机随你挑!" 对于一个没有手机的初中生废物,这个约定显然勾引了我 刷题! 刷题! 再刷! 刷废-- ...
- [游记]2020/CSP - S总结
2020 / C S P − S 总 结 2020/CSP - S总结 2020/CSP−S总结 这年的 C S P CSP CSP考的不是很理想,本来稳进的 C S P − J CSP-J CSP− ...
- CSP2022 J2参考解析
目录 P8813 [CSP-J2022] 乘方 P8814 [CSP-J2022] 解密 P8815 [CSP-J2022] 逻辑表达式 P8816 [CSP-J2022] 上升点列 题目传送: P8 ...
- emacs考场短配置
(set-background-color "gray15") (set-foreground-color "gray") ;;设置颜色 (global-set ...
随机推荐
- 【SpringBoot】 集成 Ehcache
SpringBoot ehcache 缓存 简介 EhCache 是一个纯 Java 的进程内缓存框架,具有快速.精干等特点, 是 Hibernate 中默认CacheProvider.Ehcache ...
- .net 温故知新【12】:Asp.Net Core WebAPI 中的Rest风格
RPC RPC(Remote Procedure Call),远程过程调用),这种RPC形式的API组织形态是类和方法的形式.所以API的请求往往是一个动词用来标识接口的意思,比如 https://x ...
- python开发之远程开发工具对比
前言 除了本地开发外,还有一种常见的开发方式就是远程开发,一般情况是一台Windows或mac笔记本作为日常使用的电脑,另有一台linux服务器作为开发服务器.开发服务器的性能往往较强,这样远程开发的 ...
- 【渗透测试】利用Cobalt Strike渗透Windows
目标 在kali中使用Cobalt Strike对Windows进行渗透 机器环境 kali(服务端):192.168.175.129 win11(攻击机):192.168.175.128 win11 ...
- 树莓派命令——linux命令tips
sudo python3 test.py 和 python3 test.py 完全不是一个东西,有时候是链接的编译器不同,环境是完全不同,sudo会调用一些无关资源,反而容易造成程序运行失败或浪费cp ...
- 蜂鸟E203 仿真之路
本文记录自己在学习蜂鸟E203的过程.下面简单介绍一下仿真之路所遇到的困难和走过的坑. 1.环境开发 :一般选择ubuntu 18.04 这个版本,安装这个教程很多,可以自行学习. 2.在Linux中 ...
- LCD与OLED的相爱相杀
目前市面的显示技术主要分为LCD与OLED. 本文主要记录对LCD与OLED的学习. 导言:介绍一些专业名词和术语. 像素点:是指在由一个数字序列表示的图像中的一个最小单位,称为像素. 一张图片在显示 ...
- Powe AutoMate:列表操作
大纲 记录对列表的操作 创建列表 向列表中添加元素 添加多个 合并列表 运行结果 反转列表 反转前 反转后 删除列表中的重复项 结果: 减去列表 结果:
- Pycharm:显示每一行代码的修改记录
解决方案 安装插件GitToolBox
- Cesium 概述 (二) 空间数据可视化
https://blog.csdn.net/happyduoduo1/article/details/51865811/