1 条题解

  • 0
    @ 2026-2-17 12:48:21
    #include <iostream>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    const int MAXN = 205;  // N最大为100,2*100=200,预留空间
    long long dp[MAXN][MAXN];  // 用long long避免数值溢出
    int a[MAXN];  // 存储珠子的头标记,破环为链后长度为2N
    
    int main() {
        int N;
        cin >> N;
        // 输入并破环为链
        for (int i = 1; i <= N; ++i) {
            cin >> a[i];
            a[i + N] = a[i];
        }
        // 初始化DP数组为0(单个珠子能量为0)
        memset(dp, 0, sizeof(dp));
        // 枚举区间长度(珠子个数),从2开始
        for (int len = 2; len <= N; ++len) {
            // 枚举左端点,保证右端点不越界
            for (int l = 1; l + len - 1 <= 2 * N; ++l) {
                int r = l + len - 1;
                // 枚举分割点,更新最大值
                for (int k = l; k < r; ++k) {
                    // 强制转换为long long避免中间计算溢出
                    long long energy = (long long)a[l] * a[k+1] * a[r+1];
                    dp[l][r] = max(dp[l][r], dp[l][k] + dp[k+1][r] + energy);
                }
            }
        }
        // 遍历所有长度为N的区间,取最大值
        long long ans = 0;
        for (int i = 1; i <= N; ++i) {
            ans = max(ans, dp[i][i + N - 1]);
        }
        // 输出结果
        cout << ans << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    1349
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者