我是来自某西北211高校的大二在校生,希望通过这种写博客的方式来学习算法和程序语言。
接下来是另一种很重要的算法,即动态规划,接下来我希望由简到难的讲述这个算法,我们通过例题的方式哈,先从最简单的例题开始吧,不求能给各位将这个算法讲明白,我只是希望能通过这种方式来去学习交流代码编程。再一个我自己想复习的时候也方便一点嘻嘻。
来看例题
1.一个人上楼梯,他有两种选择,一种是一次上一个台阶,一种是一次上两次台阶,问:上n个台阶共有几种方式。
废话不多说了,直接上我写的代码吧
#include<stdio.h>
int dpsuanfa(int n)
{
int dp[100],i;
dp[0]=0;
dp[1]=1;
dp[2]=2;
for(i=3;i<=n;i++)
{
dp[i]=dp[i-1]+dp[i-2];
}
return dp[n];
}
int main()
{
int n,i;
scanf("%d",&n);
i=dpsuanfa(n);
printf("%d",i);
}
动态规划就是用之前的数据去推理下一个数据,所以这个时候我们就需要一个数组去保留之前的数据,即dp,而dp【n】代表的是上n阶台阶的方法总数
当我们在第n个台阶,思考一下我们是怎么上来的,可以从n-2个台阶上,也可以从n-1个台阶上,这就得出来一个关键的表达式 【n】=【n-1】+【n-2】,以此类推,我们只需要确定这个数列的【1】与【2】便可以得到整个数列,这个数列其实是一个很典型的斐波那契数列。