给定终点n,从1到n,或+1,或*2,求最小步数(二进制思想)

导读:本篇文章讲解 给定终点n,从1到n,或+1,或*2,求最小步数(二进制思想),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

例子

n从1开始,可以对n加1,或者加倍,要使n为2014的步数

思路

重点:二进制思想

通过移位的方式:2014的二进制:111110 11110 

一开始是0000 0000 0001,乘以2相当于左移一位变成0010,然后加1后是0011,如此反复形成1111是要6步,形成11110(乘以2左移一位)是7步,形成11111(加1操作)要8步,以此类推:形成11111 0 1要11步,然后以最后那个1为起始形成11110需要7步,所以11+7=18

结论

2014的二进制为11111011110,需要的步数是2的最大幂次(加倍)加上最高位后面为1(加1)的个数。

2014>2^10;10+8=18

代码实现

int minimum_step(int n){
     vector<int> dp(n+1);
     dp[1]=0;
     for(int i=2;i<=n;i++){    
         dp[i]=dp[i-1]+1;
          if(i%2==0)
             dp[i]=min(dp[i],dp[i/2]+1);      
     }
     return dp[n];
 }

转载

本文转载自:https://www.cnblogs.com/huangzzz/p/8525535.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/103302.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!