30pts WA 求调
查看原帖
30pts WA 求调
743014
_H17_楼主2024/9/16 19:15

fi,jf_{i,j} 表示前 ii 个点 jj 个自由点的最大答案。

#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;
}
2024/9/16 19:15
加载中...