博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(算法)变成1需要的最小步数
阅读量:4512 次
发布时间:2019-06-08

本文共 1087 字,大约阅读时间需要 3 分钟。

题目:

假设有如下操作,偶数则除以2,奇数可以加1或减1,那么问给定某个数,让它变成1需要的最少操作是多少步?

思路:

1、动态规划:

递推方程:

if n&1==1  dp[n]=min(dp[n-1]+1,dp[(n+1)/2]+1)

if n&1==0  dp[n]=dp[n/2]+1

初始状态:

dp[1]=1;

dp[2]=1;

2、回溯法

通过递归方式枚举可能走的路径,在过程中通过剪枝的方式降低复杂度。

代码:

#include
#include
#include
using namespace std;int minsteps_dp(int n){ vector
steps(n+1,0); steps[0]=0; steps[1]=0; steps[2]=1; for(int i=3;i<=n;i++){ if(i&1==1) steps[i]=min(steps[i-1]+1,steps[(i+1)/2]+1); else steps[i]=steps[i/2]+1; } return steps[n];}void minsteps_backtrack(int n,int step,int &minsteps){ if(n==1){ minsteps=min(step,minsteps); return; } if(step>minsteps) return; if(n&1){ minsteps_backtrack(n-1,step+1,minsteps); minsteps_backtrack(n+1,step+1,minsteps); } else minsteps_backtrack(n/2,step+1,minsteps);}int main(){ int n; int minsteps=0; while(cin>>n){ cout<
<

 

转载于:https://www.cnblogs.com/AndyJee/p/4827459.html

你可能感兴趣的文章
matlab函数:c2d离散化函数(待完善)
查看>>
java并发多面性
查看>>
TFS 测试用例导入、导出工具
查看>>
java -jstack
查看>>
Test指令
查看>>
[置顶] 怎么对待重复的代码
查看>>
多种方法实现H5网页图片动画效果;
查看>>
Ubuntu/CentOS下使用脚本自动安装 Docker
查看>>
源码解读Mybatis List列表In查询实现的注意事项
查看>>
POJ 2311 Cutting Game(二维SG+Multi-Nim)
查看>>
1978 Fibonacci数列 3
查看>>
1225 八数码难题
查看>>
C#控件的闪烁问题解决方法总结
查看>>
js 冒泡事件与解决冒泡事件
查看>>
2018-2019赛季多校联合新生训练赛第七场(2018/12/16)补题题解
查看>>
后台全选功能以及数据的提交方法
查看>>
Android 动画效果 及 自定义动画
查看>>
const与#define相比有什么不同?
查看>>
Eclipse4.7 SpringIDE插件的安装
查看>>
C#面向对象基础
查看>>