许诺 • 16天前
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> scores(n + 1);
for (int i = 1; i <= n; ++i) {
cin >> scores[i];
}
vector<vector<unsigned long long>> dp(n + 2, vector<unsigned long long>(n + 2, 1));
vector<vector<int>> root(n + 2, vector<int>(n + 2, 0));
for (int i = 1; i <= n; ++i) {
dp[i][i] = scores[i];
root[i][i] = i;
}
for (int len = 2; len <= n; ++len) {
for (int i = 1; i <= n - len + 1; ++i) {
int j = i + len - 1;
for (int k = i; k <= j; ++k) {
unsigned long left = (k == i) ? 1 : dp[i][k - 1];
unsigned long right = (k == j) ? 1 : dp[k + 1][j];
unsigned long value = left * right + scores[k];
if (value > dp[i][j]) {
dp[i][j] = value;
root[i][j] = k;
}
}
}
}
cout << dp[1][n] << endl;
vector<int> preorder;
function<void(int, int)> build_preorder = [&](int l, int r) {
if (l > r) return;
int k = root[l][r];
preorder.push_back(k);
build_preorder(l, k - 1);
build_preorder(k + 1, r);
};
build_preorder(1, n);
for (int i = 0; i < preorder.size(); ++i) {
if (i > 0) cout << " ";
cout << preorder[i];
}
cout << endl;
return 0;
}
评论:
请先登录,才能进行评论