3 条题解

  • 0
    @ 2025-4-13 19:37:12
    #include <vector>
    #include <climits>
    using namespace std;
    
    int main() {
        int n;
        cin >> n;
        vector<int> a(2 * n);
        for (int i = 0; i < n; ++i) {
            cin >> a[i];
            a[i + n] = a[i]; // 处理环形数组
        }
    
        // 计算前缀和数组
        vector<long long> prefix(2 * n + 1, 0);
        for (int i = 1; i <= 2 * n; ++i) {
            prefix[i] = prefix[i - 1] + a[i - 1];
        }
    
        // 初始化动态规划数组
        const long long INF = 1e18;
        vector<vector<long long> > dp_min(2 * n, vector<long long>(2 * n, INF));
        vector<vector<long long> > dp_max(2 * n, vector<long long>(2 * n, -INF));
    
        for (int i = 0; i < 2 * n; ++i) {
            dp_min[i][i] = 0;
            dp_max[i][i] = 0;
        }
    
        // 动态规划填表
        for (int len = 2; len <= n; ++len) { // 合并的区间长度
            for (int i = 0; i <= 2 * n - len; ++i) { // 区间起点
                int j = i + len - 1; // 区间终点
                long long sum_ij = prefix[j + 1] - prefix[i];
    
                // 枚举分割点k
                for (int k = i; k < j; ++k) {
                    dp_min[i][j] = min(dp_min[i][j], dp_min[i][k] + dp_min[k + 1][j] + sum_ij);
                    dp_max[i][j] = max(dp_max[i][j], dp_max[i][k] + dp_max[k + 1][j] + sum_ij);
                }
            }
        }
    
        // 寻找所有可能的起点中的最优解
        long long min_score = INF, max_score = -INF;
        for (int i = 0; i < n; ++i) {
            int j = i + n - 1;
            min_score = min(min_score, dp_min[i][j]);
            max_score = max(max_score, dp_max[i][j]);
        }
    
        cout << min_score << endl;
        cout << max_score << endl;
    
        return 0;
    }
    
    

    没见过吧,那就点赞再走。

    求求了QAQ

    信息

    ID
    1639
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    157
    已通过
    64
    上传者