1 条题解

  • 0
    @ 2025-4-6 9:32:46
    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN = 500;
    const int INF = 2147483647;
    int n;
    int a[MAXN + 5];
    // f[l][r]: 把 l~r 这些牌合并好的最小代价
    int f[MAXN + 5][MAXN + 5];
    // pos[i]:i 这张牌在哪儿
    int pos[MAXN + 5];
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n;
        for (int i = 1; i <= n; i++)
        {
            int x;
            cin >> x;
            pos[x] = i; // x 这张牌在 i 号位置
        }
        for (int len = 1; len <= n; len++)
        {
            for (int l = 1; l + len - 1 <= n; l++)
            {
                int r = l + len - 1;
                if (len == 1)
                    f[l][r] = 0;
                else
                {
                    f[l][r] = INF;
                    for (int i = l; i <= r - 1; i++)
                    {
                        // 只能小的往大的放,所以两摞牌的位置恰好是两摞牌最大值的位置
                        f[l][r] = min(f[l][r],
                                      f[l][i] + f[i + 1][r] + len * abs(pos[i] - pos[r]));
                    }
                }
            }
        }
        cout << f[1][n] << "\n";
        return 0;
    }
    
    • 1

    信息

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