题目描述
小招喵喜欢在数轴上跑来跑去,假设它现在站在点n处,它只会3种走法,分别是:
1.数轴上向前走一步,即n=n+1
2.数轴上向后走一步,即n=n-1
3.数轴上使劲跳跃到当前点的两倍,即n=2*n
现在小招喵在原点,即n=0,它想去点x处,快帮小招喵算算最快的走法需要多少步?
输入描述:
小招喵想去的位置x
输出描述:
小招喵最少需要的步数
示例1
输入
3
输出
3
这是一道有一点难度的动态规划问题,用贪心不容易解决。注意这里x可能为负数,由对称性可知,x为负数的情况和x为正数的情况相同
令dp[i] 表示跳到格点i最小的步数,转移方程为
dp[i]=1+min(dp[i-1], dp[i/2]) if i%2 == 0
dp[i]=1+min(dp[i-1], dp[(i+1)/2] if i%2==1
#include <iostream>
using namespace std;
// dp[i] = 1+min(dp[i-1],dp[i/2]) if i%2
// dp[i] = 1+min(dp[i-1],dp[(i+1)/2]+1)
const int N = 100000;
int dp[N];
int main()
{
int x;
cin>>x;
if(x<0)
x=-x;
dp[0] = 0;
dp[1] = 1;
for(int i=1;i<=x;i++){
if(i%2)
dp[i] = 1+ min(dp[i-1],dp[(i+1)/2]+1);
else
dp[i] = 1+ min(dp[i-1],dp[i/2]);
}
cout<<dp[abs(x)]<<endl;
}