洛谷P3990[SHOI2013]超级跳马——思维笔记 (怎么写矩阵的典例)

题目传送:洛谷P3990[SHOI2013]超级跳马

 题解:题解 P3990 【[SHOI2013]超级跳马】

 能看出递推式就简单很多了。

做题时的思考:

  一个点可由无数点跳过来,递推式的项是无限的不好写

                   ——子项也是无限项,看看能不能发挥更大作用。

                            平移,多出来的部分根据奇偶

                            矩阵中可有起控制作用的部分

         边界上的递推式不一样,那么式子里的项展开时也有不一样的情况。

 

看题解后:

         思路中“让子项发挥更大作用”的思路对了,但没能自己找到。想的有点偏,只是看着还没写出来的递推式想,很虚无。看着图想就具体多了,从图上找找规律,也许不久就能发现。即先把能看出来、容易看出来的找出来,还能提供思路、减轻难度。不然什么条件都没有,更难。

         没想到“向右跳一格”不是作为一个起重要作用的子项,而是起一个“分界线”的作用。子项不一定在递推式里的位置越靠前越重要,不同项的重要性还是根据题目条件性质决定,而且在最后递推式中重要的子项都不一定在一开始的递推式中。

         二维递推式的矩阵优化没写过,不怎么会写。推的顺序也是个问题。一开始的想法是对于不同维度的转移,转移矩阵也不同,但这道题只要求,到自己时前一列推完。

 

再思考:

         双重for循环一项项递推的话,一列多项 都要乘矩阵,一列都乘完一次后才能让下一列的项再乘,计算的值对以后有影响,即有后效性,不能直接用结合律,也就不能直接用矩阵快速幂。 即每次递推都会有新的子项,说明这种写矩阵入手点不对,要换角度,不好单独一项项地求。

         那就尝试把一列全放矩阵里。递归式还要看前面两格的,就放两列。居然成了:

         *怎么写矩阵:要包括用的项,最好都写一行或一列,方便根据矩阵乘法写转移矩阵。左矩阵管结果矩阵行,右矩阵管列。乘时用的结果矩阵与求出的结果矩阵大小要一样,还要给转移矩阵留出空间。左矩阵乘的时候看一行,右矩阵则看一列,知道这一条,再写矩阵就方便多了。结果矩阵当左矩阵,是一横行;当右矩阵,是一竖列。乘完后的结果矩阵的每个项都要变成递推一层后的结果。矩阵推一次可以推很多个项,不止局限于一项,还可能是一列、两列,一个整体的奇怪的部分等。

 

调试:

(1,1)还不能当f(i-2)(j)的项,因为(1,1)前面没有点,结合求得f(i-2)(j)的意义,这是“马不能出界”时出发点特判。即找到递推式的新子项后要注意意义下的限制。

posted @ 2021-08-20 11:17  千叶繁华  阅读(65)  评论(0编辑  收藏  举报