当前位置:首页 > 动态规划 > 序列DP > 正文
洛谷P8816上升点列(CSPJ2022)
2004+

题目大意:n个点,可以自由增加m个,求最长上升子序列,要求相邻两项曼哈顿距离为1,且x坐标、y坐标不递减。

题目描述

在一个二维平面内,给定 $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

说明

**【样例 \#3】**

见附件中的 `point/point3.in` 与 `point/point3.ans`。

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

**【样例 \#4】**

见附件中的 `point/point4.in` 与 `point/point4.ans`。

**【数据范围】**

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

| 测试点编号 | $n \leq$ | $k \leq$ | $x_i,y_i \leq$ |
| :———–: | :———–: | :———–: | :———–: |
| $1 \sim 2$ | $10$ | $0$ | $10$ |
| $3 \sim 4$ | $10$ | $100$ | $100$ |
| $5 \sim 7$ | $500$ | $0$ | $100$ |
| $8 \sim 10$ | $500$ | $0$ | ${10}^9$ |
| $11 \sim 15$ | $500$ | $100$ | $100$ |
| $16 \sim 20$ | $500$ | $100$ | ${10}^9$ |

解题思路

数据范围500,可以用三重循环,一重循环转移,两重循环枚举状态:f[i][j]表示以i结尾,自由点有j个的最长上升子序列。

因为有x、y坐标,我们可以先按x坐标排序,这样求上升子序列的时候就只需要处理y坐标了。

程序实现

搜索代码:暴力枚举每次选择哪个点,能选就选,维护剩下几个自由点,加个记忆化即可通过。

报歉!评论已关闭.