加分二叉树
题的主要目的并没有难到我
难倒我的是求先序排列。。。
因为做法跟题解不一样,实现起来比较困难。。
#include<iostream> #include<cstring> #include<cstdio> #include<queue> using namespace std; int n,f[60][60]; struct node { node(int a=0):w(a),l(NULL),r(NULL){} node* l; node* r; int w; }tree; int dfs(int l,int r,node* t) { int u=0,x,y,k=0; if(l==r) { t->w==l; return l; } node* tl=new node(); node* tr=new node(); for(int i=l;i<=r;i++) { if(i!=l) x=dfs(l,i-1,tl); if(i!=r) y=dfs(i+1,r,tr); if(i==l&&f[l][r]<=f[i+1][r]+f[l][l]) { f[l][r]=f[i+1][r]+f[l][l]; u=i; } else if(i==r&&f[l][r]<=f[l][i-1]+f[r][r]) { f[l][r]=f[l][i-1]+f[r][r]; u=i; } else if(f[l][r]<=f[l][i-1]*f[i+1][r]+f[i][i]) { f[l][r]=f[l][i-1]*f[i+1][r]+f[i][i]; u=i; } if(k!=u) if(x) tl->w=x; if(y) tr->w=y; } if(u) t->w=u; if(u&&u+1<=r) t->r=tr; if(u&&u-1>=l) t->l=tl; return u; } void preorder(node* t) { if(t->w) cout<<t->w<<" "; if(t->l) preorder(t->l); if(t->r) preorder(t->r); } int main() { cin>>n; for(int i=1;i<=n;i++) cin>>f[i][i]; dfs(1,n,&tree); cout<<f[1][n]<<endl; preorder(&tree); }
#2:
#include<iostream> #include<cstring> #include<cstdio> #include<queue> using namespace std; int n,f[60][60],root[60][60]; void dfs(int l,int r) { int u=0; if(l==r) { root[l][r]=u; return; } for(int i=l;i<=r;i++) { if(i!=l) dfs(l,i-1); if(i!=r) dfs(i+1,r); if(i==l&&f[l][r]<=f[i+1][r]+f[l][l]) { f[l][r]=f[i+1][r]+f[l][l]; u=i; } else if(i==r&&f[l][r]<=f[l][i-1]+f[r][r]) { f[l][r]=f[l][i-1]+f[r][r]; u=i; } else if(f[l][r]<=f[l][i-1]*f[i+1][r]+f[i][i]) { f[l][r]=f[l][i-1]*f[i+1][r]+f[i][i]; u=i; } } root[l][r]=u; } void preorder(int l,int r) { int u=root[l][r]; cout<<u; if(u-1>=1) preorder(l,u-1); if(u+1<=n) preorder(u+1,r); } int main() { cin>>n; for(int i=1;i<=n;i++) cin>>f[i][i]; dfs(1,n); cout<<f[1][n]<<endl; preorder(1,n); }
#3:
#include<iostream> #include<cstring> #include<cstdio> #include<queue> #include<algorithm> using namespace std; int n,f[60][60],root[60][60]; void dfs(int l,int r) { if(l>r) { f[l][r]=1; return; } if(l==r) return; int u=0; for(int i=l;i<=r;i++) { dfs(l,i-1); dfs(i+1,r); if(f[l][r]<f[l][i-1]*f[i+1][r]+f[i][i]) { f[l][r]=f[l][i-1]*f[i+1][r]+f[i][i]; u=i; } } if(u) root[l][r]=u; } void preorder(int l,int r) { int u=root[l][r]; if(l>r||!u)return; cout<<u<<" "; preorder(l,u-1); preorder(u+1,r); } int main() { cin>>n; for(int i=1;i<=n;i++) cin>>f[i][i]; dfs(1,n); cout<<f[1][n]<<endl; preorder(1,n); }
60分代码,TLE:
#include<iostream> #include<cstring> #include<cstdio> #include<queue> #include<algorithm> using namespace std; int n,f[60][60],root[60][60]; void dp(int l,int r) { if(l>r) { f[l][r]=1; return; } if(l==r) { root[l][r]=l; return; } int u=0; for(int i=l;i<=r;i++) { dp(l,i-1); dp(i+1,r); if(f[l][r]<f[l][i-1]*f[i+1][r]+f[i][i]) { f[l][r]=f[l][i-1]*f[i+1][r]+f[i][i]; u=i; } } if(u) root[l][r]=u; } void preorder(int l,int r) { int u=root[l][r]; if(l>r||!u)return; cout<<u<<" "; preorder(l,u-1); preorder(u+1,r); } int main() { cin>>n; for(int i=1;i<=n;i++) cin>>f[i][i]; dp(1,n); cout<<f[1][n]<<endl; preorder(1,n); }
记忆化+DP,AC代码:
#include<iostream> #include<cstring> #include<cstdio> #include<queue> #include<algorithm> using namespace std; int n,f[60][60],root[60][60]; void dp(int l,int r) { if(l==r) { root[l][r]=l; return; } if(~f[l][r]) return; if(l>r) { f[l][r]=1; return; } int u=0; for(int i=l;i<=r;i++) { dp(l,i-1); dp(i+1,r); if(f[l][r]<f[l][i-1]*f[i+1][r]+f[i][i]) { f[l][r]=f[l][i-1]*f[i+1][r]+f[i][i]; u=i; } } if(u) root[l][r]=u; } void preorder(int l,int r) { int u=root[l][r]; if(l>r||!u)return; cout<<u<<" "; preorder(l,u-1); preorder(u+1,r); } int main() { memset(f,-1,sizeof f); cin>>n; for(int i=1;i<=n;i++) cin>>f[i][i]; dp(1,n); cout<<f[1][n]<<endl; preorder(1,n); }