代码求条[悬棺]
查看原帖
代码求条[悬棺]
730917
hrk_楼主2024/7/5 15:14

rt,玄关

#include<bits/stdc++.h>
using namespace std;
int n, a[250], sum[250], dp_min[250][250], dp_max[250][250], s[250][250];
int main() {
    memset(dp_min, INT_MAX, sizeof(dp_min)); // 初始化 dp_min 数组为最大值
    memset(dp_max, INT_MIN, sizeof(dp_max)); // 初始化 dp_max 数组为最小值
    cin >> n;
    sum[0] = 0;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        sum[i] = sum[i - 1] + a[i]; // 计算前缀和
        dp_min[i][i] = 0;
        dp_max[i][i] = 0;
        s[i][i] = i;
    }
    for (int l = 2; l <= n; l++) { // 枚举区间长度
        for (int i = 1; i + l - 1 <= n; i++) { // 枚举区间起点
            int j = i + l - 1; // 计算区间终点
            for (int k = i; k < j; k++) { // 枚举合并点
                int cc = sum[j] - sum[i - 1]; // 计算当前区间的石子总数
                int mc = dp_min[i][k] + dp_min[k + 1][j] + cc; // 计算最小得分
                int ac = dp_max[i][k] + dp_max[k + 1][j] + cc; // 计算最大得分
                if (dp_min[i][j] > mc) { // 更新最小得分
                    dp_min[i][j] = mc;
                    s[i][j] = k;
                }
                if (dp_max[i][j] < ac) { // 更新最大得分
                    dp_max[i][j] = ac;
                    s[i][j] = k;
                }
            }
        }
    }
    int ansMin = INT_MAX, ansMax = INT_MIN;
    for (int i = 1; i <= n; i++) { // 枚举起始位置
        ansMin = min(ansMin, dp_min[i][i + n - 1]); // 计算最小得分
        ansMax = max(ansMax, dp_max[i][i + n - 1]); // 计算最大得分
    }
    cout << ansMin << endl;
    cout << ansMax << endl;
    return 0;
}

2024/7/5 15:14
加载中...