比赛 动规 评测结果 AAAAAAA
题目名称 加分二叉树 最终得分 100
用户昵称 Menamovic 运行时间 0.002 s
代码语言 C++ 内存使用 0.33 MiB
提交时间 2017-06-18 20:51:28
显示代码纯文本
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int e=50;
  6. const int maxn=-999999999;
  7. int n;
  8. int f[e][e];
  9. int a[e];
  10. int root[e][e]={0};
  11.  
  12. void front(int x,int y)
  13. {
  14. if(root[x][y]!=0) printf("%d ",root[x][y]);
  15. if(root[x][root[x][y]-1]!=0) front(x,root[x][y]-1);
  16. if(root[root[x][y]+1][y]!=0) front(root[x][y]+1,y);
  17. }
  18.  
  19. int main()
  20. {
  21. freopen("jfecs.in","r",stdin);
  22. freopen("jfecs.out","w",stdout);
  23. scanf("%d",&n);
  24. for(int i=0;i<=n;i++)
  25. {
  26. for(int j=0;j<=n;j++)
  27. {
  28. f[i][j]=1;
  29. }
  30. }
  31. for(int i=1;i<=n;i++)
  32. {
  33. scanf("%d",&a[i]);
  34. f[i][i]=a[i];
  35. root[i][i]=i;
  36. }
  37. for(int len=1;len<=n;len++)
  38. {
  39. for(int i=1;i<=n;i++)
  40. {
  41. int j=i+len;
  42. if(j<=n)
  43. {
  44. int temp=maxn;
  45. for(int k=i;k<=j;k++)
  46. {
  47. if(temp<f[i][k-1]*f[k+1][j]+a[k])
  48. {
  49. temp=f[i][k-1]*f[k+1][j]+a[k];
  50. root[i][j]=k;
  51. }
  52. }
  53. f[i][j]=temp;
  54. }
  55. }
  56. }
  57. printf("%d\n",f[1][n]);
  58. front(1,n);
  59. return 0;
  60. }