惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
Martin Fowler
Martin Fowler
I
InfoQ
腾讯CDC
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
爱范儿
爱范儿
Microsoft Security Blog
Microsoft Security Blog
Google DeepMind News
Google DeepMind News
D
DataBreaches.Net
云风的 BLOG
云风的 BLOG
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
博客园 - 聂微东
Microsoft Azure Blog
Microsoft Azure Blog
D
Docker
博客园 - 三生石上(FineUI控件)
Y
Y Combinator Blog
博客园 - Franky
Engineering at Meta
Engineering at Meta
B
Blog
罗磊的独立博客
Apple Machine Learning Research
Apple Machine Learning Research
Jina AI
Jina AI
V
Visual Studio Blog

博客园 - kyovcs

通用连接数据库的C#类 感受 C# 3.0 的优雅 用FLASHMX连结ASPX的方式 防止SQL注入漏洞 使用TRUNK连接多台交换机VLAN(Vlan + Trunk) VLAN间路由实验 配置RIPv2(Enabling Rip v2) Cisco IOS 基本命令集 CCNA课堂精简笔记 .NET委托:一个C#睡前故事 C#学习笔记 取胜之道 点灯游戏算法 关于被整除问题 八方块移动游戏 Visual C# 诠释常用排序算法 A*寻路初探 线索二叉树(C# 2.0) 二叉树遍历算法实现(C#2.0)
最少步骤:N变1
kyovcs · 2007-09-04 · via 博客园 - kyovcs

如果n为偶数,则将它除以2,
如果n为奇数,则将它加1或者减1。
问对于一个给定的n,怎样才能用最少的步骤将它变到1。
例如:
n= 61
n-- 60
n/2 30
n/2 15
n++ 16
n/2 8
n/2 4
n/2 2
n/2 1

算法设计:首先想到的是递规算法,不过细想一下我们可以动态规划:设a(i)为整数i用最少步骤变成1的解,设n=i+1 那么我们考虑a(n),如果n为偶数,那么a(n) = a(n/2) +1; 如果为奇数,那么a(n) = Min(a( (n+1)/2+2 ),   a((n-1)/2 +2 )). 算法初始化:明显a(1) = 0; 下面是用C++实现的算法:

C++算法演示