DP专练1( [NOIP 2003]加分二叉树 + 太空梯 )
我们先慢慢来
- 加分二叉树
- 题目
- 题解
- 简单讲解前序//中序//后序遍历
- 代码实现
- 太空梯
- 题目
- 题解
- 代码实现
加分二叉树
题目
题解
简单讲解前序//中序//后序遍历
其实说白了,这个*序就是根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]加分二叉树 + 太空梯 )相关推荐
- [SOCI2005]最大子矩阵(DP) + [JXOI2018]守卫(DP) + [CQOI2016]手机号码(数位DP)[各种DP专练]
DP专练博客 DP专练 T1:最大子矩阵 题目 题解 代码实现 T2:守卫 题目 题解 代码实现 T3:手机号码 题目 题解 代码实现 T1:最大子矩阵 题目 这里有一个n*m的矩阵,请你选出其中k个 ...
- DP专练2 (大理石 + [ZJOI 2010]数字计数)
你肯定以为DP专练会有很多题, 但是请考虑一下本仙女的DP码力,一次性能更几个题... 来吧,别害怕呀~~ 文章目录 大理石 题目 题解 代码实现 数字计数 题目 题解 代码实现 大理石 题目 林老师 ...
- DP专练4:[SCOI 2010]股票交易(单调队列优化dp)
昨天晚上,初见它时,月黑风高,一个电脑,一支笔,一个人 今天秋高气爽,再一瞥,回眸间 我又来了,honey 题目 题解 代码实现 题目 题解 首先这种 iii 天与前面 jjj 天有关联,而且让你求最 ...
- 4.28dp专练总结
a 颓废了一会决定写博客 这是一篇DP专练考试总结 我真的快累死了. 时间:大概4h 6道题(丧心病狂):) T1: 数字三角形的基础上,加了若干次询问,每次废掉一个点,然后在求最优值. T2: FJ ...
- 【树型DP】加分二叉树
问题 b: [树型DP]加分二叉树 时间限制: 1 Sec 内存限制: 64 MB 提交: 8 解决: 6 [提交] [状态] [讨论版] [命题人:admin] 题目描述 科技忽略了过程就是魔法 ...
- 【树形区间DP】加分二叉树(ssl 1033/luogu 1040)
加分二叉树 ssl 1033 luogu 1040 题目大意: 有一棵中序遍历为1,2,3-n的二叉树(当然二叉树的样子没有固定),现在给出每个节点的分数,一个节点的加数=两个子节点的加数相乘+当前节 ...
- AcWing479.加分二叉树(区间DP)题解
加分二叉树 题目传送门 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,-,n),其中数字1,2,3,-,n为节点编号. 每个节点都有一个分数(均为正整数),记第i个节点的分数为di ...
- 【codevs 1090】加分二叉树(记忆化搜索)
1090 加分二叉树2003年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 设一个n个节点的二 ...
- [Luogu1040] 加分二叉树
[Luogu1040] 加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的 ...
最新文章
- db4o Tutorial 中文翻译(十一)
- 【WP7】对象序列化
- 数据结构 排序【简单排序(冒泡、插入)、希尔排序、堆排序、排序方法的综合比较、2套 排序汇总代码】
- mysql在线检测失败_一则线上MySql连接异常的排查过程
- BZOJ 1411Vijos 1544 : [ZJOI2009]硬币游戏【递推,快速幂】
- intellij运行spark的maven方式运行WordCount
- Arduino录音时间延长_如何规划好自己的时间让它产生更大价值?
- 小米大杀器稳了?队友泄露小米MIX4 5G预售页面...
- Android 封装handler,Android 异步通信原理机制-- handler
- Scala Package Package Objects
- django定义Model中的方法和属性
- swift 实现音视频播放器
- MyBatisPlus中的TypeHandler
- Jquery 模板插件 jquery.tmpl.js 的使用方法(1):基本语法,绑定,each循环,ajax获取json数据...
- swagger(三):统一返回结果不显示字段说明
- 载入pytorch的预训练模型时遇到_pickle.UnpicklingError: unpickling stack underflow
- 喜欢计算机专业的理由英语,计算机专业的英文自我介绍
- Docker--网络详解
- Android——adapter解读
- 2007工程院院士增选候选名单
热门文章
- MATLAB图像处理与数字信号处理资料分享来袭
- 《SAS编程与数据挖掘商业案例》学习笔记之十
- oss多线程 上传_oss-android/ios-sdk 断点续传(多线程)
- 大数据、java、python、区块链、人工智能哪个发展前景更好?
- 通信开源linux,Linux环境进程间通信
- golang防止MySQL注入_mysql – 如何最大限度地降低golang服务中下游服务中SQL注入的风险?...
- 2020项目商机_2020未来商机,一万元可以做什么项目
- 开线程插数据_python笔记7-多线程之线程同步(锁lock)
- php多进程 写入文件_PHP多进程中使用file_put_contents安全吗?
- java先进先出 循环队列,JavaScript队列、优先队列与循环队列