我们先慢慢来

  • 加分二叉树
    • 题目
    • 题解
      • 简单讲解前序//中序//后序遍历
    • 代码实现
  • 太空梯
    • 题目
    • 题解
    • 代码实现

加分二叉树

题目


题解

简单讲解前序//中序//后序遍历

其实说白了,这个*序就是根root的遍历顺序
先序就是root–>left–>right
中序就是left–>root–>right
后序就是left–>right–>root

上图:

那么这个图很完美啊!!有两个儿子的,又有只有左儿子的,还有只有右儿子的
先序:1 2 4 3 5
中序:4 2 1 3 5
后序:4 2 5 3 1
以讲解先序遍历顺序为例:
首先找到根root=1,然后再去搜索左儿子2,这个时候2为新子树的根,
接着搜索2的左儿子4,4是叶子节点回溯,其次搜索2的右儿子,无,回溯
回到最上面搜索1的右儿子3,然后搜索3的左儿子,空,回溯,
最后找到右儿子5,叶子节点,回溯
讲解一个顺序把近几年所学的逻辑顺序词给憋完了


那么这道题其实就很水,加上数据那么小,直接暴力跑生成树就ok了
对于搜索的这个新子树的范围l,r,枚举这之间任何一个i为根的情况,
求个MAX
记录个root=i,最后用递归输出即可

代码实现

#include <cstdio>
#define MAXN 35
int dp[MAXN][MAXN];
int root[MAXN][MAXN];
int a[MAXN];
int n;
void build ( int l, int r ) {if ( dp[l][r] ) return;if ( l > r ) {dp[l][r] = 1;return;}if ( l == r ) {dp[l][r] = a[l];root[l][r] = l;return;}for ( int i = l;i <= r;i ++ ) {build ( l, i - 1 );build ( i + 1, r );if ( dp[l][i - 1] * dp[i + 1][r] + a[i] > dp[l][r] ) {dp[l][r] = dp[l][i - 1] * dp[i + 1][r] + a[i];root[l][r] = i;}}
}
void print ( int l, int r ) {if ( ! root[l][r] ) return;printf ( "%d ", root[l][r] );print ( l, root[l][r] - 1 );print ( root[l][r] + 1, r );
}
int main() {scanf ( "%d", &n );for ( int i = 1;i <= n;i ++ )   scanf ( "%d", &a[i] );build ( 1, n );printf ( "%d\n", dp[1][n] );print ( 1, n );return 0;
}

太空梯

题目

题目描述
有一群牛要上太空。他们计划建一个太空梯-----用一些石头垒。他们有k(1<=k<=400)种不同类型的石头,每一种石头的高度为h_i(1<=h_i<=100),数量为c_i(1<=c_i<=10),并且由于会受到太空辐射,每一种石头不能超过这种石头的最大建造高度a_i(1<=a_i<=40000)。帮助这群牛建造一个最高的太空梯。

输入格式
第一行为一个整数即k。第2行到第k+1行每一行有3个数,代表每种类型魔法石的特征,即高度h,限制高度a和数量c。
输出格式
一个整数,即修建太空梯的最大高度。

样例
样例输入
3
7 40 3
5 23 8
2 52 6
样例输出
48
【样例说明】 15+21+12
最底下为3块石头2型,中间为3块石头1型,上面为6块石头3型。放置4块石头2型和3块石头1型是不可以的,因为顶端的石头1型的高度超过了40的限制。

题解

这道题也是一个多重背包水题

首先肯定会想到排序,因为石头类型的高度限制越小,肯定越往下排,往上很容易超过最高限制

然后我们就定义一个:bool类型的dp[i][j]
表示只使用1~i种类型石头且总高度为j的剋行性,
可以凑出来并且合法就是1,反之0

dp[i][j]=max(dp[i-1][j],dp[i-1][j-k*stone[i].h]) k表示i石头使用的个数

我们知道dp[i][j]只与i-1上一种石头类型有关
所以我们就简化成一维

dp[j]=max(dp[j], dp[j-k*stone[i].h])

这里还是像其他dp题一样,j要从大到小枚举
简单解释为什么;
当我们i++后要重新开始枚举j,如果是从小到大,
因为我们是一维,就会对上一次i改变后的答案进行更改
而我们到后面的会有 j - k * stone[i].h 的操作,这个时候我们其实是需要i-1的状态,
如果从小到大状态答案就被覆盖了,最后ans也会出错

代码实现

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
#define MAXN 405
#define MAX 40005
struct node {int h, limit, c;
}stone[MAXN];
bool cmp ( node x, node y ) {return x.limit < y.limit;
}
int n, Max;
bool dp[MAX];
int main() {scanf ( "%d", &n );for ( int i = 1;i <= n;i ++ ) {scanf ( "%d %d %d", &stone[i].h, &stone[i].limit, &stone[i].c );Max = max ( Max, stone[i].limit );}sort ( stone + 1, stone + n + 1, cmp );dp[0] = 1;for ( int i = 1;i <= n;i ++ )for ( int j = Max;j >= 0;j -- )for ( int k = 0;k <= stone[i].c;k ++ ) {if ( j < k * stone[i].h || j > stone[i].limit ) break;else dp[j] = max ( dp[j], dp[j - k * stone[i].h] );}for ( int i = Max;i >= 0;i -- )if ( dp[i] ) {printf ( "%d\n", i );break;}return 0;
}

好了,就到这里吧,这只是练练手,不然怎么叫专练1呢~~

等会儿我就会携带着一堆毒瘤来见大家的,bye~

DP专练1( [NOIP 2003]加分二叉树 + 太空梯 )相关推荐

  1. [SOCI2005]最大子矩阵(DP) + [JXOI2018]守卫(DP) + [CQOI2016]手机号码(数位DP)[各种DP专练]

    DP专练博客 DP专练 T1:最大子矩阵 题目 题解 代码实现 T2:守卫 题目 题解 代码实现 T3:手机号码 题目 题解 代码实现 T1:最大子矩阵 题目 这里有一个n*m的矩阵,请你选出其中k个 ...

  2. DP专练2 (大理石 + [ZJOI 2010]数字计数)

    你肯定以为DP专练会有很多题, 但是请考虑一下本仙女的DP码力,一次性能更几个题... 来吧,别害怕呀~~ 文章目录 大理石 题目 题解 代码实现 数字计数 题目 题解 代码实现 大理石 题目 林老师 ...

  3. DP专练4:[SCOI 2010]股票交易(单调队列优化dp)

    昨天晚上,初见它时,月黑风高,一个电脑,一支笔,一个人 今天秋高气爽,再一瞥,回眸间 我又来了,honey 题目 题解 代码实现 题目 题解 首先这种 iii 天与前面 jjj 天有关联,而且让你求最 ...

  4. 4.28dp专练总结

    a 颓废了一会决定写博客 这是一篇DP专练考试总结 我真的快累死了. 时间:大概4h 6道题(丧心病狂):) T1: 数字三角形的基础上,加了若干次询问,每次废掉一个点,然后在求最优值. T2: FJ ...

  5. 【树型DP】加分二叉树

    问题 b: [树型DP]加分二叉树 时间限制: 1 Sec  内存限制: 64 MB 提交: 8  解决: 6 [提交] [状态] [讨论版] [命题人:admin] 题目描述 科技忽略了过程就是魔法 ...

  6. 【树形区间DP】加分二叉树(ssl 1033/luogu 1040)

    加分二叉树 ssl 1033 luogu 1040 题目大意: 有一棵中序遍历为1,2,3-n的二叉树(当然二叉树的样子没有固定),现在给出每个节点的分数,一个节点的加数=两个子节点的加数相乘+当前节 ...

  7. AcWing479.加分二叉树(区间DP)题解

    加分二叉树 题目传送门 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,-,n),其中数字1,2,3,-,n为节点编号. 每个节点都有一个分数(均为正整数),记第i个节点的分数为di ...

  8. 【codevs 1090】加分二叉树(记忆化搜索)

    1090 加分二叉树2003年NOIP全国联赛提高组  时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description   设一个n个节点的二 ...

  9. [Luogu1040] 加分二叉树

    [Luogu1040] 加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的 ...

最新文章

  1. db4o Tutorial 中文翻译(十一)
  2. 【WP7】对象序列化
  3. 数据结构 排序【简单排序(冒泡、插入)、希尔排序、堆排序、排序方法的综合比较、2套 排序汇总代码】
  4. mysql在线检测失败_一则线上MySql连接异常的排查过程
  5. BZOJ 1411Vijos 1544 : [ZJOI2009]硬币游戏【递推,快速幂】
  6. intellij运行spark的maven方式运行WordCount
  7. Arduino录音时间延长_如何规划好自己的时间让它产生更大价值?
  8. 小米大杀器稳了?队友泄露小米MIX4 5G预售页面...
  9. Android 封装handler,Android 异步通信原理机制-- handler
  10. Scala Package Package Objects
  11. django定义Model中的方法和属性
  12. swift 实现音视频播放器
  13. MyBatisPlus中的TypeHandler
  14. Jquery 模板插件 jquery.tmpl.js 的使用方法(1):基本语法,绑定,each循环,ajax获取json数据...
  15. swagger(三):统一返回结果不显示字段说明
  16. 载入pytorch的预训练模型时遇到_pickle.UnpicklingError: unpickling stack underflow
  17. 喜欢计算机专业的理由英语,计算机专业的英文自我介绍
  18. Docker--网络详解
  19. Android——adapter解读
  20. 2007工程院院士增选候选名单

热门文章

  1. MATLAB图像处理与数字信号处理资料分享来袭
  2. 《SAS编程与数据挖掘商业案例》学习笔记之十
  3. oss多线程 上传_oss-android/ios-sdk 断点续传(多线程)
  4. 大数据、java、python、区块链、人工智能哪个发展前景更好?
  5. 通信开源linux,Linux环境进程间通信
  6. golang防止MySQL注入_mysql – 如何最大限度地降低golang服务中下游服务中SQL注入的风险?...
  7. 2020项目商机_2020未来商机,一万元可以做什么项目
  8. 开线程插数据_python笔记7-多线程之线程同步(锁lock)
  9. php多进程 写入文件_PHP多进程中使用file_put_contents安全吗?
  10. java先进先出 循环队列,JavaScript队列、优先队列与循环队列