前言
昨天看了牛客网直播–左神的算法直播,讲了啊里巴巴的编程题,并由此展开,为我们讲了如何将暴力递归的代码一步一步转换成了动态规划的代码,简直妙哉!在这里我就利用自己有限的智商总结(抄袭)下如何将递归到动态规划的代码转换之道。
转换之道
直接上题讲解吧!
一排有N个位置,一个机器人在最开始停留在P位置,如果P==0位置,下一分钟机器人一定向右移动到1位置;
如果P==N-1,下一分钟机器人一定向左移动到N-2位置。如果P在0到N-1位置,下一分钟机器人一定会向左或
者向右移动。求K分钟的时候,机器人到达T位置有多少种走法。
这个题的递归过程应该可以很快的想到。核心就是K分钟的时候,机器人需到达T位置,那么K-1分钟时,那么机器人一定得到达T-1位置,或者T+1为位置。需要注意的是在T的初始值为0,即开始位置在0,那么K-1分钟时,机器人必定得在T+1位置,也就是1位置。同理当T的初始值为N-1,那么K-1分钟时,机器人必定得在T-1的位置,也就是N-2的位置。代码如下:
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){//要到达T==0位置,机器人前一位置应该在1位置
return f1(N,P,K-1,T+1);
}
if(T==N-1){//要到达T==N-1位置,机器人前一位置应该在N-2位置
return f1(N,P,K-1,T-1);
}
//分别从前一位置的T-1位置或者T+1位置走。
return f1(N,P,K-1,T-1)+f1(N,P,K-1,T+1);
}
那么怎么将上面的代码转换成相应的动态规划过程的代码。首先应该注意的是,在上面代码中,f1函数的四个参数,N,P的值是固定不变的,也就是机器人开始停留的位置,和一排的位置数目应该是固定,变化的是K跟T的值。可以这么来理解是,机器人只能在指定的一个范围来移动。而T的范围其实就是0~N-1,而K就是0~K-1啦。那么我们可以说f1函数得到的解空间其实就是在K*N的范围之内。那么问题就变成如何在解空间K*N的棋盘上填数了。
例如,我们现在假设K=5,N=5,P=2,T=2;那么解空间就是5*5的矩阵空间如下,且我们知道最开始(0,2)位置应该填上1,代表在开始我们到达 (0,2)有一种方法。而第一行的其他位置都