1 条题解

  • 0
    @ 2025-10-8 16:59:29
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int N=510;
    struct node
    {
        int x, y, L;
    }a[N];
    int dp[N][110];
    
    int main()
    {
        int n, K;scanf("%d%d", &n, &K);
        for(int i=1;i<=n;i++)scanf("%d%d", &a[i].x, &a[i].y);
        a[i].L = a[i].x + a[i].y;
        sort(a+1, a+n+1, [](const node &n1, const node &n2){return (n1.x != n2.x) ? n1.x < n2.x : n1.y < n2.y;});
        memset(dp, 0, sizeof(dp));
        for(int i=1;i<=n;i++)for(int j=0;j<=K;j++) dp[i][j] = 1 + j;
        for(int i=2, j;i<=n;i++)
        {
            for(j=i-1;j>=1;j--)if(a[j].x <= a[i].x && a[j].y <= a[i].y)
            {
                int t = a[i].L - a[j].L;
                if(t > K + 1) continue;
                for(int k=0;k <= K - t + 1;k++)
                {
                    dp[i][k + t - 1] = max(dp[i][k + t - 1], dp[j][k] + t);
                }
            }
        }
        int ans=0;
        for(int i=1;i<=n;i++)for(int j=0;j<=K;j++)ans = max(ans, dp[i][j]);
        printf("%d\n", ans);
        return 0;
    }
    
    • 1

    【DP状态设计】[CSP-J 2022] 上升点列

    信息

    ID
    1981
    时间
    1000ms
    内存
    512MiB
    难度
    7
    标签
    递交数
    51
    已通过
    12
    上传者