比赛 动规 评测结果 AAAAAAA
题目名称 加分二叉树 最终得分 100
用户昵称 kZime 运行时间 0.001 s
代码语言 C++ 内存使用 0.34 MiB
提交时间 2017-06-19 22:05:47
显示代码纯文本
  1. # include <bits/stdc++.h>
  2. # define ll long long
  3. using namespace std;
  4. inline int gn() {
  5. int k = 0, f = 1;
  6. char c = getchar();
  7. for(; !isdigit(c); c = getchar()) if(c == '-') f = -1;
  8. for(; isdigit(c); c = getchar()) k = k * 10 + c - '0';
  9. return k * f;
  10. }
  11. ll q[40][40], f[40][40], val[40];
  12. int n;
  13. ll dp(int l, int r) {
  14. if(r + 1 == l) return 1;
  15. if(f[l][r]) return f[l][r];
  16. ll tmp, ans = -1;//保证有一个tmp
  17. for(int t, k = l; k <= r; k++) {
  18. if((t = dp(l, k - 1) * dp(k + 1, r) + val[k]) > ans) {
  19. ans = t;
  20. tmp = k;
  21. }
  22. }
  23. q[l][r] = tmp;
  24. return f[l][r] = ans;
  25. }
  26. void print(int l, int r) {
  27. if(l > r) return;
  28. printf("%lld ", q[l][r]);
  29. print(l, q[l][r] - 1);
  30. print(q[l][r] + 1, r);
  31. }
  32. int main() {
  33. # ifndef LOCAL
  34. freopen("jfecs.in", "r", stdin);
  35. freopen("jfecs.out", "w", stdout);
  36. # else
  37. freopen("in", "r", stdin);
  38. # endif
  39. n = gn();
  40. for(int i = 1; i <= n; i++) {
  41. f[i][i] = val[i] = gn();
  42. q[i][i] = i;
  43. }
  44. printf("%lld\n", dp(1, n));
  45. print(1, n);
  46. }