1 solutions
-
0
C++ :
#include<bits/stdc++.h> using namespace std; struct point{ int x,y;//点的x轴y轴 }p[550]; bool cmp(point a,point b) { return a.x+a.y<b.x+b.y;//双轴坐标合从小到大排序 } int dp[550][110]; int main() { // freopen("point.in", "r", stdin); // freopen("point.out", "w", stdout); int n,k; cin>>n>>k; for(int i=1;i<=n;i++) cin>>p[i].x>>p[i].y; sort(p+1,p+1+n,cmp);//排序 for(int i=1;i<=n;i++)//n个点 { for(int j=0;j<=k;j++)//能增加的点j { dp[i][j]=j+1;//起始点,没开始加,就是0+1个点 for(int t=1;t<i;t++) { if(p[t].x<=p[i].x&&p[t].y<=p[i].y)//前面加的点x,y必须小于当前点 { //能加d个点 int d=p[i].x-p[t].x+p[i].y-p[t].y-1; //如果够加,找到的规律 if(d<=j) dp[i][j]=max(dp[i][j],dp[t][j-d]+d+1); } } } } int ans=0; for(int i=1;i<=n;i++) ans=max(ans,dp[i][k]); cout<<ans; return 0; }
- 1
Information
- ID
- 18878
- Time
- 2000ms
- Memory
- 512MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By