机器人走方格(初识递归和动态规划)

题目

有一个X * Y的网格,机器人只能走方格而且每一步只能向右或向下走求机器人从左上角走到右下角一共有多少种走法

思路在这里插入图片描述

如图是一个3 * 3的网格,机器人从左上角出发,向右走则以后要走的是3 * 2的网格,往下走则以后要走的是2 * 3方格的方格
由此可得递推公式为:
f(x, y) = f(x, y - 1) + f(x - 1, y)
当网格只有一行或者一列时,只有一种走法
则递归的出口为x == 1 或 y == 1

动态规划:
根据递归改写为动态规划
递归的可变参数有两个,用二维数组保存每一步的数据
当x == 1 || y == 1时,array[x][y] = 1
否则array[x][y] = array[x - 1][y] + array[x][y - 1]

代码

在这里插入代码片/*
 * 有一个X * Y的网格,机器人只能走方格而且每一步只能向右或向下走
 * 求机器人从左上角走到右下角一共有多少种走法
 */
public class Robot {
	public static void main(String[] args) {
		int m = 6;
		int n = 6;
		System.out.println(solution1(m, n));
		System.out.println(solution2(m, n));
	}
	//向右走方格的列数减1,向下走方格的行数减1
	public static int solution1(int x, int y) {  //递归法
		if(x == 1 || y == 1)//只有一行或只有一列时只有一种走法
			return 1;
		else
			return solution1(x, y - 1) + solution1(x - 1, y); 
	}
	public static int solution2(int m, int n) {  //递推法(动态规划)
		int[][] array = new int[m + 1][n + 1];
		for (int i = 1; i < array.length; i++) {
			for (int j = 1; j < array.length; j++) {
				if(i == 1 || j == 1)  //只有一行或者只有一列时只有一种走法
					array[i][j] = 1;
				else
					array[i][j] = array[i][j - 1] + array[i - 1][j];
			}
		}
		return array[m][n];
	}

}

发布了33 篇原创文章 · 获赞 3 · 访问量 3781

猜你喜欢

转载自blog.csdn.net/qq_43169220/article/details/103676910