10 条题解

  • 1
    @ 2023-3-4 17:17:52

    题目大意

    在一个二维平面内,给定 n 个整数点 (xi, yi)(xi​,yi),此外你还可以自由添加 k 个整数点。

    你在自由添加 k 个点后,还需要从 n +k 个点中选出若干个整数点并组成一个序列,使得序列中任意相邻两点间的欧几里得距离恰好为 1 而且横坐标、纵坐标值均单调不减。请给出满足条件的序列的最大长度。

    思路

    先把点进行排序,然后从第i个枚举到第k个再列出状态转移方程

    代码

    #include<bits/stdc++.h>
    using namespace std;
    int k,n;
    struct node{
    	int x,y;
    	bool operator<(const node &w) const{
    	    if(x==w.x) return y<w.y;
    	    return x<w.x;
    	}
    }a[1111];
    int f[501][101];
    int main(){
    	cin>>n>>k;
    	for(int i=1;i<=n;i++ ){
    	    cin>>a[i].x>>a[i].y;//输入横坐标和纵坐标
    	}
    	sort(a+1,a+1+n);
    	for(int i=1;i<=n;i++){
    		f[i][k]=1;
    		for(int j=0;j<=k;j++){
    			for(int l=1;l<i;l++){
    				if(a[l].x>a[i].x||a[l].y>a[i].y){
    					continue;//已经试过直接舍去
    				}
    				int dx=abs(a[i].x-a[l].x);//两个横坐标的差
    				int dy=abs(a[i].y-a[l].y);//两个纵坐标的差
    				int d=dx+dy-1;//减去一个重复的点2
    				if(j+d>k){
    					continue;//要添加的点数超过了k舍去
    				}
    				f[i][j]=max(f[i][j],f[l][j+d]+d+1);
    			}
    		}
    	}
    	int sum=0;
    	for(int i=1;i<=n;i++){
    		for(int j=0;j<=k;j++){
    			sum=max(sum,j+f[i][j]);//对比得最大长度
    		}
    	}
    	cout<<sum;
    	return 0;
    }
    
    思想感情

    *😕 *

    信息

    ID
    2919
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    111
    已通过
    36
    上传者