3 条题解
-
0
#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
- 上传者