1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| #include <cmath> #include <cstdio> #include <iostream> #include <algorithm> #define ll long long const ll MAXN = 511, inf = 1000000000; using namespace std; ll n; ll sum[MAXN]; ll son[MAXN][2]; ll p[MAXN], f[MAXN][MAXN], root[MAXN][MAXN]; ll solve(ll l, ll r) { if(l > r) return 0; if(f[l][r] != inf * inf) return f[l][r]; else { for(ll i = l; i <= r; ++i) if(solve(l, i - 1) + solve(i + 1, r) + sum[r] - sum[l - 1] < f[l][r]) { f[l][r] = solve(l, i - 1) + solve(i + 1, r) + sum[r] - sum[l - 1]; root[l][r] = i; } return f[l][r]; } } int dfs(int l, int r) { if(l > r) return -1; son[root[l][r]][0] = dfs(l, root[l][r] - 1); son[root[l][r]][1] = dfs(root[l][r] + 1, r); return root[l][r]; } int main() { scanf("%lld", &n); for(ll i = 1; i <= n; ++i) for(ll j = 1; j <= n; ++j) f[i][j] = inf * inf; for(ll i = 1; i <= n; ++i) { scanf("%lld", &p[i]); sum[i] = sum[i - 1] + p[i]; } printf("%lld\n", solve(1, n)); dfs(1, n); for(ll i = 1; i <= n; ++i) printf("%lld %lld\n", son[i][0], son[i][1]); return 0; }
|