上升点列 真题_CSP2022-J第二轮

#include <bits/stdc++.h>
using namespace std;
#define IO ios::sync_with_stdio(false); cin.tie(0), cout.tie(0);
typedef long long ll;
#define endl '\n'
#define pii pair<int,int>
#define x first
#define y second
const int maxn=5e2+10;
int n,k;
pii a[maxn];
int dp[maxn][maxn];//到达i点使用了j个虚拟点
void solve()
{
   cin>>n>>k;
   for(int i=1;i<=n;i++)cin>>a[i].x>>a[i].y;
   sort(a+1,a+n+1);
   int ans=1;
   for(int i=1;i<=n;i++)
   {
       for(int j=0;j<=k;j++)
       {
           dp[i][j]=1;
           for(int e=1;e<i;e++)
           {
               if(i==e||a[e].x>a[i].x||a[e].y>a[i].y)continue;//保持单调递减
               int dis=abs(a[i].x-a[e].x)+abs(a[i].y-a[e].y);
               if(dis-1>j)continue;
               dp[i][j]=max(dp[i][j],dp[e][j-dis+1]+dis);
           }
           ans=max(ans,dp[i][j]+k-j);
       }
   }
   cout<<ans<<endl;
}
int main()
{
    IO;
    solve();
    return 0;
}

题目描述

在一个二维平面内,给定 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 。请给出满足条件的序列的最大长度。
例如目前的点列是
1 1 1
1 0 1
1 1 1
其中1代表是整数点,0代表空,现在最多添加0个整数点,那么目前的最长点列长度是5

输入

第一行两个正整数 n, k  分别表示给定的整点个数、可自由添加的整点个数。
接下来 n  行,第 i  行两个正整数 x i, y i  表示给定的第 i 个点的横纵坐标。

输出

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

样例输入
8 2
3 1
3 2
3 3
3 6
1 2
2 2
5 5
5 3

样例输出
8

提示
数值范围
保证对于所有数据满足:1 ≤n ≤500 , 0 ≤ k ≤100 。对于所有给定的整点,其横纵坐标  1≤ x i, y i ≤  10 9 ,且保证所有给定的点互不重合。对于自由添加的整点,其横纵坐标不受限制。
 

  • 23
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值