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~
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P1896 [SCOI2005]互不侵犯

P1896 [SCOI2005]互不侵犯 题目&#xff1a; 在NN的棋盘里面放K个国王&#xff0c;使他们互不攻击&#xff0c;共有多少种摆放方案。国王能攻击到它上下左右&#xff0c;以及左上左下右上右下八个方向上附近的各一个格子&#xff0c;共8个格子。 题解&#xff1a; 需要知道…

AT2368-[AGC013B]Hamiltonish Path【构造】

正题 题目链接:https://www.luogu.com.cn/problem/AT2368 题目大意 给出 nnn 个点 mmm 条边的一张无向图&#xff0c;然后求一条路径满足 路径长度不小于二。路径无交。对于所有的 xxx 与路径的端点相连&#xff0c;那么 xxx 在路径上。 1≤n,m≤1051\leq n,m\leq 10^51≤n,…

YBTOJ:运动积分(trie树)

文章目录题目描述解析代码题目描述 解析 做了巨长时间… 进行了一次刺激的阅读理解竞赛… 感谢whh dalao&#xff01; 那么让我们分析一下这道题 首先我们考虑单个求x选手的q值 不难发现 i 在第j天和x的大小关系只与a[x]与a[i]二进制下不同的最高位k有关 j的第k位与x相同时&am…

年终总结,我为什么离开舒适区?

当圣诞夜过去&#xff0c;也意味着这一年即将结束&#xff0c;迎来崭新的开始&#xff0c;一年时间既短暂&#xff0c;又漫长&#xff0c;当离开人生的舒适区&#xff0c;将迎来一个又一个的挑战。如果说一个人的优秀&#xff0c;取决于他天赋&#xff0c;以及他为之付出的额外…

NC16886 炮兵阵地

题目&#xff1a; n*m个网格&#xff0c;有平原&#xff0c;有山地&#xff0c;平原可以放部队&#xff0c;部队攻击范围如图&#xff08;不受地形影响&#xff09;&#xff08;H为山地&#xff0c;P为平原&#xff09; 题解&#xff1a; 确定状态&#xff1a; 因为每个炮可…

CF891B-Gluttony【构造】

正题 题目链接:https://www.luogu.com.cn/problem/CF891B 题目大意 给出nnn个数字互不相同的一个序列aaa&#xff0c;求它的一个排列bbb&#xff0c;使得选出任意一个1∼n1\sim n1∼n的下标真子集&#xff0c;都有aaa的对应下标和不等于bbb的对应下标和。 1≤n≤22,0≤ai≤10…

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

你肯定以为DP专练会有很多题&#xff0c; 但是请考虑一下本仙女的DP码力&#xff0c;一次性能更几个题。。。 来吧&#xff0c;别害怕呀~~ 文章目录大理石题目题解代码实现数字计数题目题解代码实现大理石 题目 林老师是一位大理石收藏家&#xff0c;他在家里收藏了n块各种…

二阶常系数齐次线性递推数列

定义 若数列 \(\{a\}\) 满足 \(a_nc_1a_{n-1}c_2a_{n-2}\) &#xff0c;\(c_1,c_2\) 为常数&#xff0c;就称这种数列为二阶常系数齐次线性递推数列。 求解 加入能够将递推关系式改写为 \((a_n-ka_{n-1})p(a_{n-1}-ka_{n-1})\) 的形式&#xff0c;就可以求出 \(a_n-ka_{n-1}\) …

YBTOJ:斐波拉契(矩阵快速幂)

文章目录题目描述题目描述代码题目描述 题目描述 关键在于如何转化为本题的题目。。。 设 y(1-根号5&#xff09;/2$$ 再令&#xff1a; A(n)xn yn 通过尝试可以发现&#xff0c;A其实就是一个1,3为前两项的斐波拉契数列 则 xnA(n)-yn A的值可以用矩阵快速幂来求 而y是在(-1,…

ABP 框架 数据库底层迁移 Mysql 集群

技术交流&#xff0c;请加QQ群&#xff1a;538327407我的各种github 开源项目和代码&#xff1a;https://github.com/linbin524背景笔者 目前架构的IOT 项目是使用abp 框架作为后台,虽然abp的框架适用于中小型项目框架&#xff0c;但由于架构优美&#xff0c;笔者认为还是可以经…

CF280D-k-Maximum Subsequence Sum【模拟费用流,线段树】

正题 题目链接:https://www.luogu.com.cn/problem/CF280D 题目大意 一个长度为nnn的序列&#xff0c;mmm次操作 修改一个数询问一个区间中选出kkk段不交子段使得和最大 1≤n≤105,1≤m≤2105,1≤k≤201\leq n\leq 10^5,1\leq m\leq 2\times 10^5,1\leq k\leq 201≤n≤105,1≤…

数论练习1 ( 曹冲养猪 + [POJ 2891]Strange Way to Express Integers + 乘法逆元【带证明】)

虽然作业还没有做完&#xff0c;但是我还是放不下它&#xff0c;对此&#xff0c;我只想说&#xff1a; 今天你对作业爱理不理&#xff0c;明天它就让你补到飞起 DP先放放&#xff0c;我们要雨露均沾练习上手&#xff1a;乘法逆元题目题解代码实现曹冲养猪?&#xff08;互质的…

总结:8.9 模拟(枚举搜索)

文章目录前言考场流程T1 fansT2 huarongT3 meetT4 truth复盘T1 fansT2 huarongT3 meetT4 truth总结前言 25分… 主要的原因&#xff1a; 几乎到了考试结束才看到本次是搜索模拟&#xff01;直接当全盲的模拟做的&#xff0c;T1和T4受到极大影响贪了。几乎已经是老生常谈&…

【做题记录】[NOI2008] 假面舞会—有向图上的环与最长链

luogu 1477 [NOI2008] 假面舞会 容易发现&#xff1a; 如果图中没有环&#xff0c;那么面具种数一定是所有联通块内最长链之和&#xff0c;最少为 \(3\) 。 如果有环&#xff0c;则面具种数一定是所有环的大小的最大公约数。 那么只要求出每一个联通块内的最长链与环即可。 由…

开发.NET Core NuGet包并实现CI/CD

实际开发中我们需要对一些公共类库进行开发&#xff0c;并基于Jenkins进行CI/CD&#xff08;CI:持续集成&#xff0c;CD:持续部署&#xff09;,其他项目通过NuGet引用。上文讲述了如何搭建本地NuGet服务器并发布NuGet包&#xff0c;这里不再赘述。CI/CD流程如下图&#xff1a;首…

acwing221 龙哥的问题

acwing221 龙哥的问题 文章目录题目&#xff1a;题解&#xff1a;代码&#xff1a;题目&#xff1a; 题解&#xff1a; 代码&#xff1a; #include <bits/stdc.h> using namespace std; typedef long long ll;int phi(int x) {int ansx;for(int i2;(ll)i*i<x;i)if(x%…

AT2363-[AGC012C]Tautonym Puzzle【构造】

正题 题目链接:https://www.luogu.com.cn/problem/AT2363 题目大意 给出nnn&#xff0c;要求构造一个字符串sss&#xff0c;使得能够找出恰好nnn个子序列使得这个子序列能划分成前后相等的两份。 要求∣s∣≤200|s|\leq 200∣s∣≤200&#xff0c;字符集为[1,100][1,100][1,1…

8.10模拟:贪心、最优化思路

文章目录前言最大的收获&#xff1a;考场流程T1 alignmentT2 flowerT3 reformatT4 inverse复盘T2 flowerT3 reformatT4 inverse总结前言 305分 今天考得还算不错&#xff01;awa &#xff08;冷静&#xff0c;明天数据结构还是要先写暴力&#xff09; 因为数据结构的题就是为了…

DP专练3:征途

虽然只有1道题&#xff0c;但是含金量还是够够di 文章目录题目题解代码实现题目 题解 我们直接对答案输出格式进行处理&#xff1a;设第 iii 天走的路程为 aia_iai​&#xff0c;总路程为 S∑i1nleniS\sum_{i1}^nlen_iS∑i1n​leni​&#xff0c;那么 v∑i1m(ai−Sm)2mv∑_{i1…

云时代的.NET

编程语言从最初的0101机器码到汇编语言再到面向对象的编程&#xff0c;不断的发展&#xff0c;整个发展趋势呈现高内聚、低耦合、可重用、可理解的特点。最早编程是用机器码&#xff0c;人的大脑不像电脑&#xff0c;无法处理0101&#xff1b;后来汇编语言还是太费解&#xff0…