华为OD在线OJ
已购买本专栏用户,请私信博主开通账号,在线刷题!!!
在线OJ:立即刷题
题库专栏:2023华为OD机试(A卷+B卷)(C++JavaJSPy)
题目描述
求从坐标零点到坐标点n的最小步数,一次只能沿横坐标轴向左或向右移动 2 或 3。
注意:途径的坐标点可以为负数
输入描述
坐标点n
输出描述
输出从坐标零点移动到坐标点n的最小步数
备注
1 <= n <= 10^9
用例
输入
4
输出
2
从坐标零点移动到4,最小需要两步,即右移2,再右移2
代码思路-动态规划
我们可以定义一个数组dp,其中dp[i]表示到达坐标点i所需的最小步数。初始时,dp[0]为0,表示到达坐标零点不需要移动。
然后,我们可以通过遍历数组dp来计算dp[i]的值。对于每个dp[i],我们可以选择从dp[i-2]或dp[i-3]转移过来,因为一次只能移动2或3步。所以我们可以得到状态转移方程:
dp[i] = min(dp[i-2], dp[i-3]) + 1
其中,dp[i-2]表示从坐标点i-2移动2步到达坐标点i,dp[i-3]表示从坐标点i-3移动3步到达坐标点i。因为题目要求途径的坐标点可以为负数,所以我们需要保证i-2和i-3都是合法的坐标点。
最后,我们可以返回dp[n]作为最终的结果,即到达坐标点n所需的最小步数。
代码思路 - 找规律
本题可以从简单的小数量级问题种推导出复杂的大数量级问题的规律:
1 = -2 + 3
2 = 2
3 = 3
4 = 2 + 2
5 = 3 + 2
6 = 3 + 3
7 = 3 + 2 + 2
8 = 3 + 3 + 2
9 = 3 + 3 + 3
10 = 3 + 3 + 2 + 2
11 = 3 + 3 + 3 + 2
12 = 3 + 3 + 3 + 3
13 = 3 + 3 + 3 + 2 + 2
14 = 3 + 3 + 3 + 3 + 2
15 = 3 + 3 + 3 + 3 + 3
从上面的规律可以发现,当n>=4时,n每增加3,则对应最少步数+1,,例如n=10时,步数增加1.