上次是动态规划关于硬币规划问题,我们大致了解到所谓动态规划和递归也是有不小的区别的,递归是将之前的所有可能全部求出,但是动态规划却是只需要求出一部分也就是和硬币息息相关的最近的两步,很是有趣。这次我将要以机器人横竖走问题来再次的对动态规划进行一次解析。
首先我们有一个机器人,这个机器人只能横竖走(显然是个菜鸡程序员写的,我要是写,他就不动),在横有六格,竖有五格的这么一个长方形方格中,他从左上角走到右下角,每次只能走一格,问一共有多少种走法?
上面的表格就是我们这次的主角,我们发现,如果想要知道机器人走到终点需要多少种可能那么就必然需要知道机器人到两个蓝色方块的次数,然后相加之和就是机器人到终点的次数。同理
从上面的表格中我们可以知道,如果想要知道机器人到蓝色方格的次数,自然需要知道机器人到绿色和紫色方格的次数,然后相加之和就是机器人到蓝色方格的次数,两个蓝色方格的次数相加就是到终点的次数。
我想,现在你已经发现了,这样无限循环下去,如何是个头啊,所以他必定需要一个初始值,显然这个初始值就是1(因为你可以试试,无论如何走只有一种可能)
这样是不是很明显了,然后一步一步的加下去,自然就出来如下结果:
这是实现这个效果的代码:
package jiqiren;
import java.util.Scanner;
public class jiqiren {
public static void main(String args[])
{
int x ;
int y ;
Scanner scanner = new Scanner(System.in);
System.out.println("我们将要做的是对机器人只能在定量方格中横竖走的问题求解");
System.out.println("请输入这个方格横有多少块");
x = scanner.nextInt();
System.out.println("请输入这个方格竖有多少块");
y = scanner.nextInt();
System.out.println("机器人走到右下角有"+yunsuan(x,y)+"种情况");
}
public static int yunsuan (int x, int y)
{
int[][] Square =new int[x][y];
for (int i = 0 ;i< x; i++)
{
Square[i][0] = 1;
}
for (int i = 0 ;i< y; i++)
{
Square[0][i] = 1;
}
for (int i = 1 ;i< x; i++ )
{
for (int j = 1 ;j< y ; j++)
{
Square[i][j] = Square[i-1][j] + Square[i][j-1];
}
}
return Square[x-1][y-1];
}
}