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 - 单调队列
就是题目的意思,单调队列。分别求最大和最小,然后输出。