题意
老虎和蒜头是好朋友。
蒜头生活在数轴上,蒜头中学为 $ 0 $ ,蒜头中学旁边有 $ n $ 家餐馆,编号为 $ i $ 的餐馆位置为 $ i,i \in [1,n] $ 。
蒜头打算从蒜头中学所在的 $ 0 $ 号位置出发吃午餐,一开始他有 $ x $ 点行动力,他可以在数轴上左右移动。由于吃得越饱越难移动,如果他吃了 $ a $ 克食物,那么他每移动 $ 1 $ 单位距离(例如从位置 $ 1 $ 移动到位置 $ 2 $ )需要付出 $ a+1 $ 点移动力。
如果某时刻蒜头在位置 $ i \in [1,n] $ ,并且他没有进过第 $ i $ 家餐馆,那么他可以考虑进去吃饭。如果进去吃饭,蒜头会吃下 $ a_i $ 克食物(从而导致移动需要的移动力变大)。
蒜头打算吃得饱饱的,然后走回到蒜头中学(即回到 $ 0 $ )。蒜头想知道在能走回蒜头中学的前提下他最多能吃几克食物。根本不出校门也算可行的方案。
大样例见下发文件中的ex_w2.in和ex_w2.out。
对于所有数据, $ 0 \le a_i \le x $
子任务编号 | 子任务分值 | $ n \le $ | $ x \le $ |
$ 1 $ | $ 10 $ | $ 12 $ | $ 10^6 $ |
$ 2 $ | $ 20 $ | $ 500 $ | $ 1000 $ |
$ 3 $ | $ 25 $ | $ 5000 $ | $ 10^6 $ |
$ 4 $ | $ 45 $ | $ 100000 $ | $ 10^6 $ |
题解
原来的思路是枚举最远到达的点,然后对前面的点做一个背包,记f[i]为费用为i的最大价值。但这样不太可优化,考虑怎样才能让状态数量少一些。发现费用的上限只有1e6,而对于坐标比较大的点,它使价值的最大增加量很小。考虑如何利用这一性质,是否可以使每个点只计算x/坐标个状态?发现从这个点走回去一定要花费坐标*当前价值,于是把DP的状态改为价值,从后往前做,f[i]表示走到当前点,价值为i的最小费用,这样因为还要带着这些价值回到起点,故只有在x/坐标以内的价值才是可行的,这样效率就优化为 O ( n ∗ l n ( n ) ) O(n*ln(n)) O(n∗ln(n))了。