codevs 1090 加分二叉树
Posted 一入OI深似海
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codevs 1090 加分二叉树相关的知识,希望对你有一定的参考价值。
/* 根据中序遍历的性质 加上子树的类似递归处理 嗯 是个石子归并 然而边界老写不对 还有循环顺序 一气之下写了记忆化.... 几下每个区间的最优值由那个点分开 即子树的根是谁 然后递归输出来 注意先递左子树 后递右子树 */ #include<iostream> #include<cstdio> #include<cstring> #define maxn 35 using namespace std; int n,f[maxn][maxn],v[maxn],c[maxn][maxn],pre[maxn],len; void Dfs(int l,int r) { if(l>r)return; int k=c[l][r]; pre[++len]=k; Dfs(l,k-1);Dfs(k+1,r); } int DP(int l,int r) { if(r<l)return 1; if(f[l][r])return f[l][r]; for(int i=l;i<=r;i++) { int k=DP(l,i-1)*DP(i+1,r)+v[i]; if(k>f[l][r]) { f[l][r]=k;c[l][r]=i; } } return f[l][r]; } int main() { //freopen("jfecs.in","r",stdin); //freopen("jfecs.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&v[i]); for(int i=1;i<=n;i++) f[i][i]=v[i],c[i][i]=i; printf("%d\n",DP(1,n)); Dfs(1,n); for(int i=1;i<=n;i++) printf("%d ",pre[i]); return 0; }
以上是关于codevs 1090 加分二叉树的主要内容,如果未能解决你的问题,请参考以下文章