10 条题解
- 
  0
fij表示当前取到第i个点,剩下j 个自由点
接下来考虑状态转移:
- 取到第i个点时没有添加点fij=fi-1j;
 - 在第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
 - 标签
 - 递交数
 - 112
 - 已通过
 - 36
 - 上传者