1 条题解

  • 0
    @ 2025-4-18 17:04:50
    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN = 300; // MAXM==MAXN
    int n, m;
    int a[MAXN + 5];
    set<int> D;
    // dp[l][r] a[l]~a[r] 最多消除的数量
    int dp[MAXN + 5][MAXN + 5];
    void work()
    {
        cin >> n >> m;
        for (int i = 1; i <= n; i++)
            cin >> a[i];
        D.clear();
        for (int i = 1; i <= m; i++)
        {
            int d;
            cin >> d;
            D.insert(d);
        }
        // dp[i][i-1] 是长度为 0 的区间
        for (int l = 1; l <= n; l++)
            for (int r = l - 1; r <= n; r++)
                dp[l][r] = 0;
        // 区间dp
        for (int len = 2; len <= n; len++)
            for (int l = 1; l + len - 1 <= n; l++)
            {
                int r = l + len - 1;
                // 直接分两边   l~i i+1~r
                for (int i = l; i <= r - 1; i++)
                    dp[l][r] = max(dp[l][r], dp[l][i] + dp[i + 1][r]);
                // 中间消完,头尾消除
                if (dp[l + 1][r - 1] == (r - 1) - (l + 1) + 1 &&
                    D.find(a[r] - a[l]) != D.end())
                    dp[l][r] = max(dp[l][r], dp[l + 1][r - 1] + 2);
                // 中间挑个位置,消除 a[l],a[i],a[r]
                for (int i = l + 1; i <= r - 1; i++)
                {
                    if (a[i] - a[l] == a[r] - a[i] &&
                        D.find(a[i] - a[l]) != D.end() &&
                        dp[l + 1][i - 1] == (i - 1) - (l + 1) + 1 &&
                        dp[i + 1][r - 1] == (r - 1) - (i + 1) + 1)
                        dp[l][r] = max(dp[l][r], dp[l + 1][i - 1] + dp[i + 1][r - 1] + 3);
                }
            }
        cout << dp[1][n] << "\n";
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int T;
        cin >> T;
        while (T--)
            work();
        return 0;
    }
    

    信息

    ID
    13419
    时间
    1000ms
    内存
    512MiB
    难度
    7
    标签
    (无)
    递交数
    18
    已通过
    8
    上传者