10 条题解

  • 0
    @ 2023-3-4 16:45:28

    fij表示当前取到第i个点,剩下j 个自由点

    接下来考虑状态转移:

    1. 取到第i个点时没有添加点fij=fi-1j;
    2. 在第i个点的基础上添加了点,设添加了p个(p=xj-xt+yj-yt-1)其中状态转移方程为:fij=max(j+1,fi-1j,fti-j+p+1)

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=510,K=110;
    int n,k,ans;
    struct node{
    	int x,y;
    }a[N];
    int f[N][K];
    
    bool cmp(node a,node b){
    	if(a.x!=b.x) return a.x<b.x;
    	else return a.y<b.y;
    }
    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,cmp);
    	for(int i=1;i<=n;i++)
    	{
    		f[i][k]=1;
    		for(int j=0;j<=k;j++)
    		{
    			for(int t=1;t<i;t++)
    			{
    				if(a[t].x>a[i].x||a[t].y>a[i].y)	continue;//要符合题意的序列限制
    				int dx=abs(a[i].x-a[t].x);
    				int dy=abs(a[i].y-a[t].y);
    				int d=dx+dy-1;//求在x,y之间我们要加多少个自由点
    				if(j+d>k)	continue;//如果要加的自由点超过k个,就不能再转移了
    				f[i][j]=max(f[i][j],f[t][j+d]+d+1);
    			}
    		}
    	}
    	for(int i=1;i<=n;i++)
    		for(int j=0;j<=k;j++)
    		{
    			ans=max(ans,j+f[i][j]);
    		}
    	cout<<ans;
    	return 0;
    }
    

    信息

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