计蒜客区间dp例题 奇怪的二叉树(NOIP2003加分二叉树)

来源:互联网 发布:科学与认识的关系 知乎 编辑:程序博客网 时间:2024/06/06 14:19

又是原题……所以我交1500智商税买了个什么……
题目描述

设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号。每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都有一个加分,任一棵子树subtree(也包含tree本身)的加分计算方法如下:

subtree的左子树的加分× subtree的右子树的加分+subtree的根的分数。

若某个子树为空,规定其加分为1,叶子的加分就是叶节点本身的分数。不考虑它的空子树。

试求一棵符合中序遍历为(1,2,3,…,n)且加分最高的二叉树tree。要求输出;

(1)tree的最高加分

(2)tree的前序遍历

输入输出格式

输入格式:
第1行:一个整数n(n<30),为节点个数。

第2行:n个用空格隔开的整数,为每个节点的分数(分数<100)。

输出格式:
第1行:一个整数,为最高加分(结果不会超过4,000,000,000)。

第2行:n个用空格隔开的整数,为该树的前序遍历。
输入样例#1: 复制
6
5 4 2 6 3 1
输出样例#1: 复制
11
说明

对于50%的数据,n≤2500

对于100%的数据,n≤40000。
感觉树的题目还是不熟练……
不会树形dp所以没往那想
好像也不用……

#include<iostream>#include<cstdio>#include<cstring>using namespace std;int n;int f[35][35],get[35][35];int getsum(int l,int r){    if(l>r) return 1;//空子树    if(f[l][r]==-1){//没遍历过        for(int k=l;k<=r;k++)        {            int now=getsum(l,k-1)*getsum(k+1,r)+f[k][k];            //枚举树根            if(now>f[l][r])            {                f[l][r]=now;                get[l][r]=k;//l,r区间以k为根可以最大            }        }    }    return f[l][r];}void print_ans(int l,int r){    if(l>r) return;    cout<<get[l][r]<<" ";    if(l==r) return;    print_ans(l,get[l][r]-1);    print_ans(get[l][r]+1,r);//分别左右儿子}int main(){    scanf("%d",&n);    memset(f,-1,sizeof(f));    for(int i=1;i<=n;i++)        scanf("%d",&f[i][i]),get[i][i]=i;    printf("%d\n",getsum(1,n));    print_ans(1,n);    return 0;}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 前田香织侵犯中文字幕 佐佐木明希上司中文字幕迅雷 医生d淫孕妇 公公一晚上要8次 公公现在就想要白关婷中文字幕 丈夫上司侵犯系列在线 义父犯美媳嫁樱花叶菜在线播放 儿子的妻子在线中文字幕云播 老公去世公公每天晚上抱着我睡 被水电工掠夺的妻子在线播放b 佐佐木明希大嫂中文字幕全集 善良的小妻子字幕 公公在我洗碗时在厨房要了我 大嫂被肉翻了天佐佐木明希1 教师蕾丝短裙中文字幕 瓜棚里和大嫂乱禽 强睡大嫂中文字 免费 佐佐木明希 房东中文字幕 与父亲干柴烈火 中文字幕丈夫不在 9大嫂被禽翻中文字幕 侵犯你的贞洁 中文字幕 年轻的妻子在线观中文字幕 大嫂被翻天了佐佐木b希中文7 美丽的大嫂中文字幕影迅雷下载 邻居的妻子中文字幕下载 神马电影院电影中文 神马电影院理论中文 女儿的朋友5中文神马电影院 97手机2019电影院专用版中文 厨房里进入朋友的老婆 中文版电影院 神马电影院 中文 儿子的妻子中文字幕 下载 樱桃中文版电影院 大富豪电影院韩国中文 老婆的闺蜜们喝醉了在家 中文潮人影院您手中的电影院 朋友不在晚上去他家干 趁兄弟喝醉上他女朋友在线播放 神马电影院午伦中文