1 条题解

  • 0
    @ 2023-1-9 16:25:42
    #include <bits/stdc++.h>
    using namespace std;
    int n;
    int a[205];
    int dp[205][205]; // dp[i][j] a[i]~a[j]合并起来的最大能量值
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n;
        for (int i = 1; i <= n; i++)
        {
            cin >> a[i];
            a[i + n] = a[i];
        }
        int nn = n + n;
        a[nn + 1] = a[1];
        for (int len = 1; len <= n; len++)
        {
            for (int l = 1; l + len - 1 <= nn; l++)
            {
                int r = l + len - 1;
                // 求 dp[l][r]
                if (len == 1)
                {
                    dp[l][r] = 0;
                    continue;
                }
                dp[l][r] = 0;
                for (int k = l; k <= r - 1; k++)
                {
                    // 左 dp[l][k] a[l]~a[k]合并的对应的能量珠: a[l]开头 a[k+1]结尾
                    // 右 dp[k+1][r] a[k+1]~a[r]合并的对应的能量珠:a[k+1]开头 a[r+1]结尾
                    dp[l][r] = max(dp[l][r],
                                   dp[l][k] + dp[k + 1][r] + a[l] * a[k + 1] * a[r + 1]);
                }
            }
        }
        int ans = 0;
        for (int l = 1; l + n - 1 <= nn; l++)
            ans = max(ans, dp[l][l + n - 1]);
        cout << ans << "\n";
        return 0;
    }
    
    • 1

    信息

    ID
    800
    时间
    1000ms
    内存
    512MiB
    难度
    3
    标签
    递交数
    46
    已通过
    25
    上传者