如果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++实现的算法:



#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];
}

相关文章:

  • 2022-12-23
  • 2021-09-24
  • 2021-09-03
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-02
猜你喜欢
  • 2021-06-07
  • 2022-12-23
  • 2022-03-07
  • 2021-06-08
  • 2021-07-02
  • 2021-11-23
  • 2022-02-23
相关资源
相似解决方案