上题
有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设:
a. 每走一步时,只能从当前方格移动一格,走到某个相邻的方格上;
b. 走过的格子立即塌陷无法再走第二次;
c. 只能向北、东、西三个方向走;
请问:如果允许在方格矩阵上走n步,共有多少种不同的方案。2种走法只要有一步不一样,即被认为是不同的方案。
输入:
允许在方格上行走的步数n(n <=20)
输出:
计算出方案的数量
样例输入:2
样例输出:7
思考:这道题话说是属于动规的,但我学的比较杂,动规就学了背包,思想还是有些局限,考虑这道题时还是照着最近练的递推思想来思考,主要是考虑到当能走的方向数在上一步走完的方向上的区别,也就是上一步是向上的话还能走三个方向,向左或向右就能走上和继续往左或者右。
于是就有了三个式子:
a[0][n] = a[0][n-1] + a[1][n-1] + a[2][n-1];
a[1][n] = a[1][n-1] + a[0][n-1];
a[2][n] = a[2][n-1] + a[0][n-1];
a[0]数组存的是向上的步数,a[1], a[2]数组分别存的是向左和向右的步数,那么最后就是结果就是a[0][n] + a[1][n] + a[2][n].当时做出来还不太在意,看别的题的答案时顺带看了眼题解,哦!?f[n] = 2f[n-1]+f[n-2]???这式子怎么来的??然后再次开始思考这道本质,或者说是这个式子的由来。
看了不少博客,然而都是点到为止的感觉,经过思考整理,将其中一些得出这式子的思路呈上:
思路一:a[n] = a[n-1] + (2*a[n-2] + a[n-1] - a[n-2]);
画了三步,第一步是紫色,第二步是橙色,第三步是要算的步数,a[n-1]是第n步能走的所有向上的步数,(2*a[n-2] + a[n-1] - a[n-2])是往左右走的步数。2*a[n-2]在图中是加在上一步中向上走的那步后能往左右走的步数(这个数量等于每上上步步数(a[n-2])的两倍,加上a[n-1]是上一步的基础上都加一(上一步往两侧走的可以继续往两侧走),这时就会有多处的步数,然后减去那多的步数,我们可以看作是每个往上方向走上一步那个方向多的,然后这个步数可看成是上上步的数量(a[n-2]),然后式子经过简化就是那个极简的斐波变式。
思路二:
计算f[n]时,f[n-1]对于f[n]是有特性的,其中的左右分支(只考虑当前效果)只能再走两步,而向上的分支能走三步,而f[n-2]对于f[n]来说,仿佛失去了特性,即可以将其看作计算f[n]时每f[n-1]步都只能走两步的基础上的向上走的一步的步数(或者从f[n-2]的角度来看,其后的第二步是第一步能走的步数的两倍再加上f[n-2])。
不过这样看来仿佛是在对着题目给式子找解释,而我更希望是通过这些特定的例子,去分析他的本质或者能够从中学到做这类或者其他题时对问题本质提炼的能力或者说是直觉吧。
哦,还有就是看到一些博客发现我开始的解放也可以通过类似证明的方法将其化为最简的式子,也写了下
f[n] = a[0][n] + a[1][n] + a[2][n];
a[0][n] = a[0][n-1] + a[1][n-1] + a[2][n-1];
a[1][n] = a[1][n-1] + a[0][n-1];
a[2][n] = a[2][n-1] + a[0][n-1];
f[n] = 3 * a[0][n-1] + 2 * a[1][n-1] + 2 * a[2][n-1] = 2 * f[n-1] + a[0][n-1]
又a[0][n] = a[0][n-1] + a[1][n-1] + a[2][n-1] 则 a[0][n-1] = f[n-2]
即f[n] = 2 * f[n-1] + a[0][n-1]
最后,还差动态规划的写法,那就日后来写吧,,,(会来写吗?手动滑稽