T1.引爆炸弹(bomb)
N个炸弹构成一棵树,引爆一颗叶节点,会一直引爆到根节点。每颗炸弹有一个价值,求引爆k个炸弹的最大价值。
既然是一棵树,那么自然想到dp。所以先树形dp了一遍(由于可能出现多个根节点所以要预处理)。然后考虑到一个节点的最大价值的路径极有可能和另一路径重合导致重复,所以引入标记数组v[i],根据贪心思想,排排序取k个就好了。
T2.取石子(stone)
一圈石子,各有分数,得分判断如下:
然后可以贪心,证明取一块或两块权值最大的石头是最优的。
现取lzw大神证明如下:
假设取石头的顺序是按权值从大到小来取的,如果一个石头的权值是mid,它左边的石头权值是L,右边的石头权值是R;那么有 L,R>=mid. 再设它和左边的石头的距离为Ld,和右边的石头的距离为Rd,那么选了这个石头可以增加的分数为(Ld+Rd)*mid。 而左边的石头减少的分数为(Rd+1)*L,右边的石头减少的分数为(Ld+1)*R。显然减少的多。
然后就变成很水的题啦。
T3.化工厂装箱员(worker)
给出n个货物(有ABC三种),装箱员可以同时拿十个物品(手真大),每次装箱可以把手中同一种货物装完,然后从剩下物品中取等量的补上。求最少装箱次数。
类似于dp,但由于只能倒着来,所以采取dfs的方法,记忆化搜索。Dp(k,a,b,c)的参数表示处理到前k个物品后手中ABC物品的数量。值表示的是剩下的物品还需的次数。
那么可以枚举每次放A或B或C,从而得到当前dp(k,a,b,c)的值,就AC了。
时间: 2024-09-30 05:10:13