一、一维递推
有一个n层的楼梯,每次只能上一层或上两层,那么爬到n层有多少种方法?
分析:类比于递归,现层到达为下面一层和下面两层的和。
故递推关系式为F(n)=F(n-1)+F(n-2)
即代码表达为
/**低空间**/
int a=1,b=2,c;
for(i--n)//n为次数
{
c=a+b;
a=b;
b=c;
}
/**常用**/
int f[3];//此题为3,3个变量
f[0]=1,f[1]=2;
for (i=2--n)
f[i%3]=f[(i-1)%3]+f[(i-2)%3];
//利用的是数组滚动,DP方法中常见
二、多维递归
小明走路,仅能 向上、向下、向前走,并且走过后不能再走,则小明走n步有多少种走法?
分析:从点考虑,小明在n处的选择取决于n-1处的选择,
从面考虑,设小明的第n次选择为小明所走路径数的层数,
按照数节点的计算,n+1的节点数为 n的选择路的子路总和
F(m)=f[0]+f[1]+f[2] //其中f函数为上一次的选择数
现在利用二维函数进行优化
/**二维数组模拟**/
int ans[100][3]={0};
ans[0][1]=ans[0][1]=ans[0][2]=1;
for (i=1--n)
{
ans[i][0]=ans[i-1][0]+ans[i-1][2];//想在n向上 则n-1必不能向下 即ans[i-1][1]=0
ans[i][1]=ans[i-1][1]+ans[i-1][2];//同上 ans[i-1][0]=0
ans[i][2]=ans[i-1][0]+ans[i-1][1]+ans[i-1][2];
}
cout<<ans[i-1][0]+ans[i-1][1]+ans[i-1][2]<<endl;
/**一维递推**/
int ans[3];//此题为3个变量
ans[0]=ans[1]=1;
for (i=2--n)
ans[i%3]=2*ans[(i-1)%3]+ans[(i-2)%3];
//等式推导
三、图递推
在XY数轴中,到达(x,y)有多少种方法?
分析:利用爬楼梯思路
F(x,y)=F(x-1)(y)+F(x)(y-1)
int F[100][100]={0};
F[0][0]=1;
for ()
{
for ()
{
if (i未越界)
F[i][j]+=F[i-1][j];
if (j未越界)
F[i][j]+=F[i][j-1];
}
}
数学思路:从总路程中选择向前走的数量
F(x,y)=C(x-1,x+y-2)