例子
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