fi,j 表示前 i 个点 j 个自由点的最大答案。
#include<bits/stdc++.h>
#define int long long
using namespace std;
constexpr int N=501;
int n,k,f[N][N],ans;
struct Point{
int x,y;
Point(int x=0,int y=0):x(x),y(y){}
bool operator<(Point b){
return (x^b.x)?x<b.x:y<b.y;
}
}p[N];
int dist(Point a,Point b){
return abs(a.x-b.x)+abs(a.y-b.y);
}
signed main(){
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>p[i].x>>p[i].y;
sort(p+1,p+n+1);
for(int i=0;i<=k;i++)
f[0][i]=i;
for(int i=1;i<=n;i++)
for(int j=0;j<=k;j++){
f[i][j]=max(j+1,f[i-1][j]);
for(int point=1,dis;point<i;point++){
dis=dist(p[point],p[i]);
if(p[point].x>p[i].x||p[point].y>p[i].y||j-dis+1<0)
continue;
f[i][j]=max(f[i][j],f[point][j-dis+1]+dis);
}
}
for(int i=0;i<=n;i++)
for(int j=0;j<=k;j++)
ans=max(ans,f[i][j]);
cout<<ans;
return 0;
}