棋盘m×n的走法:
给定一个M×N的格子或棋盘,从左下角走到右上角的走法总数(每次只能向右或向上移动一个方格边长的距离
f(m,n)=f(m-1,n)+f(m,n-1).
于是状态f(i,j)的状态转移方程为:
f(i,j)=f(i-1,j)+f(i,j-1) if i,j>0
f(i,j)=f(i,j-1) if i=0
f(i,j)=f(i-1,j) if j=0
f(0,0)=0, f(0,1)=1, f(1,0)=1
递归方式:
public static int process(int m,int n){ if(m==0&&n==0){ return 0; }
if(m==1||n==1){ return 1; }
return process(m,n-1)+process(m-1,n);
}
爬楼梯:
public class Test3 {
public static void main(String[] args) {
int ladder = 4;
int maxJump = 2;
int i = cal(ladder, maxJump);
System.out.println(i);
System.out.println(count(4));
}
/* 设4个台阶,可走1、2,分析如下: 开始 / \ 1 2 / \ /\ 1 2 2 1 / \ \ \ 1 2 1 1 / 1 */
//递归
public static int cal(int ladder,int maxJump){
int jump=0;
if(ladder==0){
return 1;
}
if(ladder>=maxJump){
// 剩下的楼梯大于最大可跳跃数
for(int i=1;i<=maxJump;i++){
jump+=cal(ladder-i, maxJump);
}
}else{
// 剩下的楼梯不足最大可跳跃数
jump=cal(ladder,ladder);
}
return jump;
}
//斐波那契数列
//自己计算当楼梯数为1、2、3、4、5时,对应的爬法有:1、2、3、5、8、13、21种。
//可以发现,随着楼梯数n的增加,爬法总数呈现斐波那契数列规律增加,即f(n) = f(n-1) + f(n-2)
/* f(5) / \ f(4) f(3) / \ f(3) f(2) / \ f(2) f(1) */
public static int count(int ladder){
if(ladder==1||ladder==2){
return ladder;
}
int n1=1;
int n2=2;
int all=0;
for(int i=3;i<=ladder;i++){
all=n2+n1;
n1=n2;
n2=all;
}
return all;
} }