第一题: 动态规划,dp[i]记录到i为止的结果,last[j]表示上一次拿到宝石j的关卡。则dp[i]=max{dp[i-1], dp[last[x]] + y},要求last[x]存在。 第二题: 简单dfs,从下向上记录将子树修复所需要派出的施工队数。如果发现一个孩子的dfs为0且从本节点到孩子的道路需要修复,则该孩子的答案设为1。最后把所有孩子的答案加起来就是本节点的result。 第三题: 参考力扣原题152,本题不保证数据范围,因此要把所有a[i]对2取对数并记录符号。我写得比较恶心。先根据0切片,对每个切片分情况讨论: 如果负数的数量是偶数,则直接把子数组求和(已经转为对数)即可。 如果负数数量是奇数,找到第一个负数和最后一个负数,分别取其后和其前,更新结果即可。 第四题: 先记录每个值所对的所有下标。贪心从后往前,维护到当前为止的右侧最小值right,当且仅当a[i]≤right且a[i]占据一片连续的区域时才可以跳过a[i],否则就要把所有a[i]更新为0。同时更新right。