传送门:牛客
题目描述:
为了简化问题,我们对游戏规则进行了简化和改编:
1. 游戏界面是一个长为n,高 为m的二维平面,其中有k个管道(忽略管道的宽度)。
2. 小鸟始终在游戏界面内移动。小鸟从游戏界面最左边任意整数高度位置出发,到达游戏界面最右边时,游戏完成。
3. 小鸟每个单位时间沿横坐标方向右移的距离为1,竖直移动的距离由玩家控制。如果点击屏幕,小鸟就会上升一定高度X,每个单位时间可以点击多次,效果叠加;如果不点击屏幕,小鸟就会下降一定高度Y。小鸟位于横坐标方向不同位置时,上升的高度X和下降的高度Y可能互不相同。
4. 小鸟高度等于0或者小鸟碰到管道时,游戏失败 。小鸟高度为m时,无法再上升。
现在,请你判断是否可以完成游戏。如果可以,输出最少点击屏幕数;否则,输出小鸟最多可以通过多少个管道缝隙。样例过长,此处省略
主要思路:
- 首先根据题目找出我们的dp方程,对于这道题显然我们可以使用dp[i][j]来记录dp[i][j]来记录dp[i][j]来记录到达(i,j)(i,j)(i,j)这个坐标的最小步数.
- 显然的我们这个坐标是可以从前一步进行上升和下降得到的.对于上升我们又有两种情况,一种是从前一格往右移的时候往上飞,另一种是在当前位置按了很多次进行转移,因此我们应该有
dp[i][j]=min(dp[i−1][j−up]+1,dp[i][j−up]+1)dp[i][j]=min(dp[i-1][j-up]+1,dp[i][j-up]+1)dp[i][j]=min(dp[i−1][j−up]+1,dp[i][j−up]+1)upupup是按一次上升的高度
- 当然我们也可以由下落来得到,也就是
dp[i][j]=min(dp[i][j],dp[i−1][j+down])dp[i][j]=min(dp[i][j],dp[i-1][j+down])dp[i][j]=min(dp[i][j],dp[i−1][j+down])
- 并且对于障碍物,我们只要将那个位置的dp值改为infinfinf就行,代表无法转移到到那边,也无法从那边转移过来,对于我们最后的答案,只要判断一下我们的最后位置是否存在一个坐标的值不是infinfinf就行
下面是具体的代码部分:
#include
#include
#include
#include
#include
#include