P1941 [NOIP2014 提高组] 飞扬的小鸟 题解
动规题。
动态规划分为3步:
1.定义数组元素含义。
2.找到数组元素之间的关系式。
3.找出初始值。
这道题是细节题,有一些注意点:
1.每个单位时间可以点击多次,效果叠加。
2.最高高度不能超过m。
3.我们可以先忽略管道,最后特判。
第一步
这个题给出的状态有很多,那么很明显可以使用动态规划。
我们可以列出 dp[x][y][p] 代表到达x,y需要最少的屏幕点击次数,以及在这一位置是否点击了。
顺便方便下文讲解,我们设up[i]为x=i时,点击一次上升高度,down[i]为x=i时,不点击下降的高度。
第二步
我们考虑,dp[x][y][p]可以由什么转移过来?
当p=1的时候:dp[x][y][1]=min(dp[x-1][y-up[x-1]][0/1],dp[x][y-up[x-1]][1]。
让我来解释一下为什么要这么写,左边式子代表从上一个位置通过点击一下,可以到达当前位置。
右边式子代表由上一个位置进行了多次点击,于是效果多次累加,因此通过当前位置下面的y坐标转移过来。
需要注意的是,你在当前位置点击,并不会立马增加高度,而是会蓄势,直到下一个位置才会增加 点击的次数*点击增加的高度。
所以这里要填up[x-1]而不是up[x],我当时码代码的时候掉进了这个坑。
当p=0的时候:dp[x][y][0]=min(dp[x][y][1],dp[x-1][y+down[x-1][0/1]
及要么点,要么不点,而且p=0要在p=1已经确定的基础上选择 (即使在后面滚动数组p后也需要这样进行)。
很明显每次选取都是在p=0/1中选取最小值,那么可以滚动数组去掉p数组,上述状态转移方程其他不变。
但是有一个要求,高度为m时不能再上升,那么我们可以进行一个特判,如果此时的y>=m,那么上述方程中使y=m,dp[x][m]=min(dp[x][m],dp[x]py]),y∈(m,m+up[x-1]).
额外步骤
根据题意我们完成此dp还需要一些额外步骤。
明天更新。。。