1 solutions
-
1
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int N=50; LL w[N],f[N][N],g[N][N]; void dfs(int l,int r) { if(l>r) //没有节点 { return ; } int k=g[l][r]; //当前根 cout<<k<<" "; dfs(l,k-1); //左子树 dfs(k+1,r); //右子树 } int main() { int n; cin>>n; for(int i=1;i<=n;i++) cin>>w[i]; for(int len=1;len<=n;len++) //长度 { for(int l=1;l<=n;l++) //左端点 { int r=l+len-1; //右端点 if(l==r) //叶子节点 { f[l][r]=w[l]; g[l][r]=l; } else { for(int k=l;k<=r;k++) //枚举根 { LL left=1,right=1; //左右 if(k!=l) left=f[l][k-1]; if(k!=r) right=f[k+1][r]; LL s=left*right+w[k]; //计算和 if(s>f[l][r]) //更新 { f[l][r]=s; g[l][r]=k; } } } } } cout<<f[1][n]<<endl; dfs(1,n); return 0; }
- 1
Information
- ID
- 999
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 7
- Tags
- (None)
- # Submissions
- 14
- Accepted
- 4
- Uploaded By