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
- 标签
- 递交数
- 111
- 已通过
- 36
- 上传者