博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[题解](树形dp/记忆化搜索)luogu_P1040_加分二叉树
阅读量:5309 次
发布时间:2019-06-14

本文共 948 字,大约阅读时间需要 3 分钟。

树形dp/记忆化搜索

首先可以看出树形dp,因为第一个问题并不需要知道子树的样子,

然而第二个输出前序遍历,必须知道每个子树的根节点,需要在树形dp过程中记录,递归输出

那么如何求最大加分树——根据中序的特征,想到以枚举根结点为起点那么轻易得出如果根结点的编号为x,那么左子树的结点有1~x-1,右子树 结点有x+1~n

 

#include
#include
#include
using namespace std;int n,d[30];int f[30][30];int rt[30][30];int dfs(int l,int r){ if(l>r)return 1;//无儿子 if(l==r){ rt[l][r]=l;return d[l]; } if(f[l][r])return f[l][r]; int ans=0,root; for(int i=l;i<=r;i++){
//枚举根 int tmp=dfs(l,i-1)*dfs(i+1,r)+d[i]; if(tmp>ans){ ans=tmp; root=i;//根 } } rt[l][r]=root; f[l][r]=ans; return ans;}void print(int l,int r){ if(l>r)return; printf("%d ",rt[l][r]); print(l,rt[l][r]-1); print(rt[l][r]+1,r);}int main(){ scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&d[i]); printf("%d\n",dfs(1,n)); print(1,n);}

 

转载于:https://www.cnblogs.com/superminivan/p/11019488.html

你可能感兴趣的文章
Delphi中ListView类的用法
查看>>
多米诺骨牌
查看>>
Linq 学习(1) Group & Join--网摘
查看>>
asp.net 调用前台JS调用后台,后台掉前台JS
查看>>
Attribute(特性)与AOP
查看>>
苹果手表:大方向和谷歌一样,硬件分道扬镳
查看>>
Competing Consumers Pattern (竞争消费者模式)
查看>>
Android面试收集录15 Android Bitmap压缩策略
查看>>
PHP魔术方法之__call与__callStatic方法
查看>>
ubuntu 安装后的配置
查看>>
web前端之路,js的一些好书(摘自聂微东 )
查看>>
【模板】对拍程序
查看>>
【转】redo与undo
查看>>
解决升级系统导致的 curl: (48) An unknown option was passed in to libcurl
查看>>
Java Session 介绍;
查看>>
spoj TBATTLE 质因数分解+二分
查看>>
Django 模型层
查看>>
dedecms讲解-arc.listview.class.php分析,列表页展示
查看>>
Extjs6 经典版 combo下拉框数据的使用及动态传参
查看>>
【NodeJS】http-server.cmd
查看>>