1 solutions

  • 0
    @ 2025-11-5 18:26:24

    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