今天开始学习有关动态规划的知识.先从这道题开始吧!
有11个阶梯,可以上一次上一个,也可以一次上两个,有几种方法可以上完?
算法一:这是本作者自己想出来的算法,很简单,就是利用递推的思想吧!
#include<iostream>
using namespace std;
int main(int argc, char* argv[])
{
int num[12];
num[0] = 1;
num[1] = 1;
num[2] = 2;
for(int n=3; n<=11;n++)
{
num[n] = num[n-2] + num[n-1];
}
cout<<num[11]<<endl;
return 0;
}
算法二:(引用)下面的算法,采用的是动态规划的原理,动态规则是上世纪80年被牛人们发现的;
动态规则的思想,就是不重复解反复的子程序过程.对于这道上梯子的题目,意思就是一来就是0梯,
所以去0梯的方法数为1;然后从0梯可以去第1梯,那么到第一梯的方法数,应该加上到0梯的方法数;
从0梯可以去第2梯, 那么第2梯的方法数,应该加上到0梯拥有的方法数;再往下看,从第1梯,又可以通过不同的方式,到第2梯和第3梯,那么2,3梯的方法,又应该加上到第一梯拥有的方法,依次类推,动态就考虑到只计算一次.
#include<iostream>
using namespace std;
int main(int argc, char* argv[])
{
int i;
long num[12];
for(i=0; i<=11; i++)
{
num[i] = 0;
}
num[0] = 1;
for(i=0; i<=11; i++)
{
if(i+1<=11) num[i+1]+=num[i];
if(i+2<=11) num[i+2]+=num[i];
}
cout<<num[11];
return 0;
}