1 条题解

  • 0
    @ 2025-4-11 17:34:24
    #include <bits/stdc++.h>
    using namespace std;
    int n;
    int col[55];
    int num[55];
    // [l,r] 区间消除完,且 l 方块额外增加了 w 个的最优得分
    int book[55][55][20 * 50];
    int f(int l, int r, int w)
    {
        if (l > r)
            return 0;
        if (book[l][r][w])
            return book[l][r][w];
        // 只有一个方块时直接消除
        if (l == r)
            return book[l][r][w] = (num[l] + w) * (num[l] + w);
        // 找所有方案的最优值
        int ans = 0;
        // l 方块自己消除
        ans = (num[l] + w) * (num[l] + w) + f(l + 1, r, 0);
        // 考虑 l 和谁合并了
        for (int i = l + 1; i <= r; i++)
        {
            if (col[l] == col[i])
            {
                // [l] [l+1 ~ i-1] [i] [i+1 ~ r]
                // 可以把 l 对应的区域留到最后消除,这样 [i] 就会合并到一起
                ans = max(ans,
                          f(l, i - 1, w + num[i]) + f(i + 1, r, 0));
            }
        }
        return book[l][r][w] = ans;
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n;
        for (int i = 1; i <= n; i++)
            cin >> col[i];
        for (int i = 1; i <= n; i++)
            cin >> num[i];
        cout << f(1, n, 0);
        return 0;
    }
    
    • 1

    信息

    ID
    13394
    时间
    1000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    7
    已通过
    4
    上传者