有一个XxY的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。请设计一个算法,计算机器人有多少种走法。
给定两个正整数int x,int y,请返回机器人的走法数目。保证x+y小于等于12。
测试样例:
2,2
返回:2
//递归解法
public static int courseS(int i,int j,int x,int y){
if(i>x||j>y)
return 0;
if(i==x&&j==y)
return 1;
int left=0,right=0;
left+=courseS(i+1,j,x,y);
right+=courseS(i,j+1,x,y);
return left+right;
}
递归转dp
- 先确定数据范围
- 确定要求的状态
- 填补边界值
- 确定转换状态
- 状态逻辑
- 顺推
//dp解法
public static int courseSForDp(int x,int y){
int dp[][] = new int[x+1][y+1];
dp[x][y]=1;
for(int i=x;i>=1;--i)
dp[i][y]=1;
for(int j=y;j>=1;--j)
dp[x][j]=1;
for(int i=x-1;i>=1;--i){
for(int j=y-1;j>=1;--j){
dp[i][j]=dp[i+1][j]+dp[i][j+1];
}
}
return dp[1][1];
}