马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
标题:
https://www.luogu.com.cn/problem/B3626
标题形貌
地上有一排格子,共 n 个位置。呆板猫站在第一个格子上,须要取第 n 个格子里的东西。
呆板猫固然不肯意自己跑已往,以是呆板猫从口袋里掏出了一个呆板人!这个呆板人的办法依照下面的规则:
- 初始时,呆板人位于 1 号格子
- 若呆板人如今在 x 格子,那么它可以跳跃到 x−1,x+1,2x 里的一个格子(不允许跳出界)
问呆板人最少须要多少次跳跃,才气到达 n 号格子。
输入格式
仅一行,一个正整数,体现 n。
输特别式
仅一行,一个正整数,体现最少跳跃次数。
思绪:很显着的影象化搜刮和dp,但是由于标题给的搜刮方向是x-1和x+1,正序写会造成死循环,以是有什么方法吗?我们可以倒序写,由于除以2在这三个搜刮方向中优先级是最高的,以是是不须要min的,而且,x+1,x-1。都会出现偶数,然后举行除以2,以是不会死循环。
代码如下:
- #include<iostream>
- #include<algorithm>
- #include<climits>
- using namespace std;
- typedef long long ll;
- ll mem[2000000];
- ll n;
- ll dfs(ll n)
- {
- ll sum = 0;
- if (n < 1)
- return INT_MAX;//代表不可能
- if (n == 1)
- return 0;//基准条件
- if(mem[n])
- return mem[n];
- else
- {
- if (n % 2 == 0)//已是最优解 ,优先级更高原因是防止死循环(仅限这个题目x+1,x-1)
- sum = dfs(n / 2) + 1;
- else
- {
- sum = min(dfs(n+1)+1,dfs(n-1)+1);
- }
- }
- mem[n] = sum;
- return sum;
- }
- int main(void)
- {
- cin >> n;
- cout << dfs(n);
- return 0;
- }
复制代码
|