1 条题解

  • 0
    @ 2025-4-5 11:16:46
    #include <bits/stdc++.h>
    #define int long long
    using namespace std;
    const int MAXN = 500;
    const int MAXAI = 100000;
    const int INF = MAXAI * MAXN * (MAXN - 1) / 2;
    int n;
    int a[MAXN + 5];
    int sum[MAXN + 5];
    int f[MAXN + 5][MAXN + 5];
    signed main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n;
        for (int i = 1; i <= n; i++)
            cin >> a[i];
    
        for (int i = 1; i <= n; i++)
            sum[i] = sum[i - 1] + a[i];
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= n; j++)
                f[i][j] = INF;
        for (int len = 1; len <= n; len++)
            for (int l = 1; l + len - 1 <= n; l++)
            {
                int r = l + len - 1;
                for (int i = l; i <= r; i++)
                {
                    // l~i-1 先表演,然后 i 进栈压底,然后 i+1~r 表演,最后 i 表演
                    int now = 0;
                    if (i != l) // 左边没人的时候不用管左边的人
                    {
                        now += f[l][i - 1];                               // 左边表演的时间
                        now += ((i - 1) - l + 1) * (sum[r] - sum[i - 1]); // 左边表演时 i~r 在等待
                    }
                    if (i != r) // 右边没人时不用管右边的人
                    {
                        now += f[i + 1][r];              // 右边表演的时间
                        now += (r - (i + 1) + 1) * a[i]; // 右边表演时 i 在等待
                    }
                    f[l][r] = min(f[l][r], now);
                }
            }
        cout << f[1][n];
        return 0;
    }
    
    • 1

    信息

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