[NWPU][2018暑假作业][通用版]四、学算法啦啦啦——dp,并查集等 [Cloned]

https://vjudge.net/contest/235901

 

 

A - 数字三角形

刚开始直接给三角形的位置编号,用map存起来然后dfs(思维没有转变过来,还停留在上一版。。),然后超时了。。于是我打开提交情况,发现别人的代码比我的短一半多。。= =于是换成dp,AC。

 

B - LITTLE SHOP OF FLOWERS

dp。花束的数量<=花瓶数量,并且花束必须按编号插花。花束必须全部放到花瓶里面,所以当花束=花瓶时,必须按顺序插入,花束<花瓶时,会有空花瓶。

 

C - 钉子和小球

如果某个位置(i, j)有钉子,那么这个位置下一层挨着的两个钉子(i+1, j), (i+1, j+1)的概率增加(i, j)的1/2,如果这个位置没有钉子,那它下两层的正下方钉子(i+2, j+1)概率增加(i, j)。因为最后要输出分数,所以让dp[1][1]等于2的50次方,输出的时候分子是dp[n+1][m+1],分母是dp[1][1]。如果分子分母%2都等于0,就同/2,然后输出。递推。

 

D - 完全背包

dp。每年计算一次,然后每次按顺序计算只买第1个债券时,花费从1k~这一年的本金的钱能得到的利息,然后在计算买1、2两个债券时花费从1k~这一年的本金能得到的利息,如果大于原值则覆盖,依次类推。

 

E - 01背包

跟上一题差不多……想到以前写还是用的递归,写的贼长orz。

 

F - 最长公共子序列

字符串定义长一点,100会RE。

 

G - 最长下降子序列

因为一种砖块是无限提供的,所以要把一个砖块任意两边作底面的3种情况都考虑进去。为了让考虑情况减少,保持长>=宽。输入完毕后对砖块排序,按底面短边、长边降序排列。因为不知道在哪个砖块达到最高,所以要用一个maxh来存储最大高度,不断更新。

 

H - 记忆化搜索

dp。按顺序计算每个点为起点时的最长距离。

 

I - trie树

G++内存超限,C++过了……给每个结点设定一个num,存放按顺序遍历到它的次数,每次找出次数输出即可。

 

J - trie树

和上一题差不多,差别是这道题要给每一行最后一个数字一个标记,如果之后输入经过了标记,就说明出现了重复的前缀。

 

K - 并查集

先假设一人一张桌,然后开始输入,如果两个人互相认识,那么更改桌子的编号让这两个人在一张桌子上。

 

L - 并查集 

根据m组把成员划分成<=m个集合,找出包含0的集合里面的成员个数。每输入一个成员连接它和它的父节点,输出的时候直接找0的父节点的num值即可。

 

M - 并查集

每激活一个就判断它和已经激活的机器的距离,如果满足条件就让他们链接到同一个值。检查是否链接的时候只要判断他们的父节点是否相等,是否激活即可。

 

N - 并查集

跟前面的差不多……没啥好说的。

 

R - 单调队列

就是题目的意思,单调队列。分别求最大和最小,然后输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值