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 ...
随机推荐
- Pandas:获取Dataframe索引
解决方案 效果图 参考链接 https://blog.csdn.net/YENTERTAINR/article/details/109254583
- typroa文件迁移时的图片问题
如下图所示设置即可 会自动在同级目录中创建img文件夹,并存储图片
- 【pandas小技巧】--修改列的名称
重命名 pandas 数据中列的名称是一种常见的数据预处理任务.这通常是因为原始数据中的列名称可能不够清晰或准确.例如,列名可能包含空格.大写字母.特殊字符或拼写错误. 使用 pandas 的 ren ...
- 王道oj/problem12(动态申请内存存储数组)
网址:http://oj.lgwenda.com/problem/12 思路:用输入的整型创建对应数组,用scanf消除换行键: 用gets()输入语句并输出,再释放. 代码: #define _CR ...
- Redis从入门到放弃(6):持久化
1.引言 Redis作为一种高性能的内存数据存储系统,常被用作缓存.会话存储.消息队列等多种应用场景.然而,由于其数据存储在内存中,一旦发生意外或服务器重启,数据就会丢失.为了保障数据的持久性和安全性 ...
- 配置DHCP
配置DHCP 条件:关闭防火墙 和selinux 1,安装dhcp服务 [root@localhost ~]#yum install dhcp -y#安装dhcp服务 2,查看配置文件 [root@l ...
- [oracle]用户与权限管理
创建用户 CREATE USER 用户名 IDENTIFIED BY 密码 DEFAULT TABLESPACE 表空间 TEMPORARY TABLESPACE 临时表空间 QUOTA 空间配额大小 ...
- 《Pro Git》Git分支笔记
Git分支简介 在Git中,有个校验和的概念,主要用于验证数据完整性,它是一个40位16进制字符串,使用SHA-1哈希算法生成.校验和也标识了Git中每一个对象. 我们由前一章阅读了解到Git保存的是 ...
- ZS Shuffles Cards 题解
ZS Shuffles Cards 题解 我们把每一次抽一些数字牌再抽到 joker 视作一局游戏. 每局期望轮数 首先考虑 \(f_i\) 表示每一局游戏抽出 \(i\) 张牌的概率. 那么就是先抽 ...
- Windows校验文件MD5和SHA值的方法
1.需求背景 下载或传输文件后,需要计算文件的MD5.SHA256等校验值,以确保下载或传输后的文件和源文件一致 2.校验方法 如上图所示,可以使用Windows自带的certutil命令来计算一个文 ...