RT,把 N 定为 37 最后一个点会 RE,但改成 77 就可以过,但最后一个点 N 只有 25,按理来讲不应该 RE,而且本地可以正常运行。
5.in:
25
9 8 9 9 5 7 4 2 2 4 5 6 7 8 9 3 3 4 5 1 2 1 2 3 2
5.out:
781495238
8 4 2 1 3 6 5 7 16 12 10 9 11 14 13 15 20 18 17 19 23 21 22 24 25
code:
%:import "iostream"
%:import "vector"
%:import "functional"
%:define For(a, b, c) for (int a = b, a%:%:END = c; a <= a%:%:END; ++ a)
%:define int unsigned
using namespace std;
const int N = 37;
int n, v[N], dp[N][N], root[N][N];
main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n;
For (i, 1, n) cin >> v[i];
For (i, 1, n + 1) dp[i][i - 1] = 1;
For (i, 1, n) dp[i][i] = v[i], root[i][i] = i;
// For (i, 2, n) dp[i - 1][i] = v[i - 1] + v[i];
For (len, 2, n)
For (i, 1, n) {
const int j = i + len - 1;
For (k, i, j)
if (dp[i][j] < dp[i][k - 1] * dp[k + 1][j] + dp[k][k]) {
dp[i][j] = dp[i][k - 1] * dp[k + 1][j] + dp[k][k];
root[i][j] = k;
}
}
cout << dp[1][n] << R"(
)";
function<void(int, int)> print = [&](int l, int r) -> void {
if (l > r) return;
cout << root[l][r] << ' ';
if (l == r) return;
print(l, root[l][r] - 1);
print(root[l][r] + 1, r);
};
print(1, n);
}