T1.砍树(cuttree)
给出n棵树,要锯下m米木材,现在有一个高度h,h以上所有木头都砍下来,求满足m米的最小h
很简单的二分答案判断可行性。
T2.快速求和(quicksum)
给出数字串s,要在其中加上一些加号,然后按正常表达式计算,求得到值n的最小添加数,如不能输-1.
Dp(虽然std打的是dfs,但我是用dp AC的)。F[i][j]表示前i个数中和为j的最小添加数,f[i][j]=min{f[i-k][j-num[k+1][j]]+1}.(好像和我程序里写的不太一样但是效果应该一样)
这段我的代码请自行配合上面的方程式进行理解。
T3.甲虫(beetle)
有一条坐标轴(whatever反正是直的),上面有n滴水,每滴水有m毫升(whatever反正有个单位),每秒钟蒸发1毫升水,有一只甲虫在坐标原点,每秒爬行一个单位长度。求最多能喝多少水。
关灯dp模型。因为甲虫吃掉的水肯定是连续的(不然就是浪费时间),然后肯定在区间两端。那么假设甲虫在[l,r]区间内(l,r是水的标号)喝掉了k滴水的最大值。用两个数组来表示,fi[i][j],fj[i][j]分别表示喝完后在i和在j的最大值。K这层被省略了,直接枚举进去。
然后[i,j]的状态可以从[i+1,j]和[i][j-1]转移而来,这样方程式就好些了。
(要注意k是在最外层枚举的)