【UOJ 17】飞扬的小鸟

UOJ 17

题意:在\(n\times m\)的网格中有一些柱子,它们可以通过的区间是\((L_i,R_i)\),位置在\(P_i\)。在第i个位置点击一次会使高度增加\(X_i\),不点击会使高度减少\(Y_i\)。可以重复点击,效果叠加。问最少需要多少次点击来通过这个游戏。或者输出最多能通过的柱子个数。

思路:考虑\(dp(i,j)\)表示到了\((i,j)\)这个点的最少点击次数。

然后转移方程如下:\(dp(i,j)=min dp(i-1,j-kX_{i-1})+k,dp(i-1,j+Y_{i-1})\)

但是这肯定只能拿\(70pts\)

所以我们需要进行一些优化。我们记\(min dp(i-1,j-kX_{i-1})+k\)\(g(i,j)\),那么转移分为两步:

\(dp(i,j)=min(g(i,j),dp(i-1,j+Y_{i-1})\)

\(g(i,j)=min(g(i,j-X_{i-1}), dp(i-1,j-X_{i-1}))+1\)

然后就好了。

其实根本不用这样想,我们只需要这样转移:

首先从小到大枚举\(j\),对于每一个\(j\)更新\(dp(i+1,j+X_i)\)\(min(dp(i,j),dp(i+1,j))+1\)

然后从小到大(其实这里无所谓)枚举\(j\),对于每一个\(j\)更新\(dp(i+1,j)\)\(dp(i,j+Y_i)\)

这样肯定是对的,因为所有的\(dp(i,j)\)都更新到了\(dp(i+1,j+X_i)\),然后又随着\(dp(i+1,j+X_i)\)到了\(dp(i+1,j+2X_i)...\)

然后需要注意我们的答案在取的时候不要\(dp(i,j)=\infty\)的也取进去。。。

猜你喜欢

转载自www.cnblogs.com/denverjin/p/10629718.html