以两个题目来说明,并带你掌握这种转化,不用什么动态规划的方程什么的,你只需要根据题意写出暴力递归就可以了。
第一题:
一排有N个位置,一个机器人在最开始停留在P位置上,如果P==0,下一分钟机器人一定向右移动到1位置,如果P=N-1,下一分钟机器人一定向左移动到N-2位置。如果P在0到N-1之间,下一分钟机器人一定会向左或向右移动,求K分钟时候,机器人到达T位置有多少种走法。
思路:这里我们先用递归求解,然后再阐释暴力递归转动态规划的做法。
递归:在K分钟是T位置上只能从K-1分钟的T-1位置和K-1分钟的T+1位置上来,那么K分钟T位置上走法也就是他们二者之和了。然后在设置相应的边界就可以了。
public static int f1(int N,int P,int K,int T){
if (N < 2 || P < 0 || K < 1 || T < 0 || P >= N || T >= N) {
return 0;
}
if (K == 1) {
return T==P?1:0;
}
if (T == 0) {
return f1(N,P,K-1,1);
}
if (T == N - 1) {
return f1(N,P,K-1,T-1);
}
return f1(N,P,K-1,T-1)+f1(N,P,K-1,T+1);
}
暴力递归转动态规划:由递归式可知N、P传进来就没有变过,所以这个dp由K、T控制,但是T的取值范围是N,所有组成一个K*N的二维数组。然后根据递归式转换数组。
public static int f2(int N, int P, int K, int T) {
if (N < 2 || P < 0 || K < 1 || T < 0 || P >= N || T >= N) {
return 0;
}
int[][] dp = new int[K][N]