自己都不相信过了。。。
#include<bits/stdc++.h>
using namespace std;
int n,k,ans;
struct Point{
int x,y;
}p[505];
bool cmp(Point a,Point b){
return a.x<b.x||(a.x==b.x && a.y<b.y);
}
map<int,map<int,int> >m;
int dp[505][105];
int main(){
cin>>n>>k;
for(int i=0;i<n;i++)
cin>>p[i].x>>p[i].y;
sort(p,p+n,cmp);
if(k==0){
for(int i=n-1;i>=0;i--){
int x=p[i].x,y=p[i].y;
m[x][y]=max(m[x+1][y],m[x][y+1])+1;
ans=max(ans,m[x][y]);
}
cout<<ans<<endl;
}else{
for(int i=n-1;i>=0;i--){
int x=p[i].x,y=p[i].y;
for(int j=i;j<n;j++){
int x1=p[j].x,y1=p[j].y;
if(x1>=x&&y1>=y){
int k1=x1-x+y1-y-1;
for(int l=0;l+k1<=k;l++){
dp[i][l+k1]=max(dp[i][l+k1],dp[j][l]+k1+1);
ans=max(ans,dp[i][l+k1]+k-l-k1);
}
}
}
}
cout<<ans+1<<endl;
}
return 0;
}
思路:按x坐标进行排序,然后从后往前暴力dp,第一个表示第几个点,第二个表示目前已经添加了多少个点,但最后为什么是ans+1这里想不明白,同时个人无法证明该解法的正确性。
另外,x1和y1会不会CE