代码如下
#include<bits/stdc++.h>
using namespace std;
int n,k;
int f[510][510];
int d[510][510];
struct zb
{
int x,y;
}xy[510];
int jds(int a)
{
if(a<0)
a*=-1;
return a;
}
bool cmp(zb b,zb c)
{
if(c.x==b.x)
return b.y<c.y;
return b.x<c.x;
}
int qm(int a,int b)
{
if(a<b)
return a;
return b;
}
int main()
{
cin>>n>>k;
for(int i=0;i<n;++i)
{
for(int j=0;j<n;++j)
{
f[i][j]=0x3f;
}
f[i][i]=0;//f[i][j]表示从第i个点到第j个点所需添加的整点数
d[i][i]=1;//d[i][i]表示从第i个点到第j个点所构成的最长序列
}
for(int i=0;i<n;++i)
{
cin>>xy[i].x>>xy[i].y;
}
sort(xy,xy+n,cmp);
for(int i=0;i<n;++i)
{
for(int j=i+1;j<n;++j)
{
if(xy[i].x<=xy[j].x&&xy[i].y<=xy[j].y)//保持单调递增
{
f[i][j]=jds(xy[i].x-xy[j].x)+jds(xy[i].y-xy[j].y)-1;//对f[i][j]进行初始化
d[i][j]=f[i][j]+2;
}
if(f[i][j]>k)
f[i][j]=0x3f;
}
}
for(int i=0;i<n;++i)
{
for(int j=i+1;j<n;++j)
{
for(int k=j+1;k<n;++k)
{
if(xy[i].x<=xy[k].x&&xy[k].y<=xy[j].y)
{
if(f[i][j]>f[i][k]+f[k][j]&&f[i][k]+f[k][j]<=k)
{
d[i][j]=f[i][k]+d[k][j]-1;
f[i][j]=f[i][k]+f[k][j];
}
if(f[i][j]>k)
f[i][j]=0x3f;
}
}
}
}
for(int i=0;i<n;++i)
{
for(int j=i+1;j<n;++j)
{
d[i][j]=d[i][j]+k-f[i][j];//将未使用完的k-f[i][j]个点加入,扩展序列长度
}
}
int final=0;
for(int i=0;i<n;++i)
{
for(int j=i+1;j<n;++j)
{
if(d[i][j]>final)
{
final=d[i][j];
}
}
}
cout<<final;
return 0;
}
思路应该没什么问题,但是答案差点