如果n为偶数,则将它除以2,
如果n为奇数,则将它加1或者减1。
问对于一个给定的n,怎样才能用最少的步骤将它变到1。
如果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++算法演示
#include<iostream>
#include<vector>
using namespace std;
int Trilogy(int n)
{
vector<int>results(n+1,0);
results[1] = 0;
for(int i=2; i<=n; i++)
{
if(i%2==0)
results[i] = results[i/2]+1;
else
{
int temp1 = results[(i+1)/2];
int temp2 = results[(i-1)/2];
results[i] = temp1<temp2?temp1+2:temp2+2;
}
}
return results[n];
}