3665

自解
在遇到镜子时,只会像右或向下,与遍历方向是一致的
依旧可以使用DP
对每个格子(i,j),考虑向右或向下
如果向右,右格子是镜子,那么下一步到达的是(i,j+1)->(i+1,j+1)
但要考虑下一步是否依然还是镜子
考虑定义一个函数get,用来求解经过镜子后,最终到达的目的地是哪里
参数为当前坐标i,j,和此时的方向,向右为0,向下为1
经过镜子时,就是把0变1,把1变0
结束,直到i,j超过界限,或者目标点不为镜子
那么dp过程就是,从00开始,不断向右和向下遍历,当某个方向是镜子时,那就是Get(镜子坐标)加上当前的dp值;
DEBUG




这个错误就是说,原dfs中注释掉的那部分,针对f造成了重复计算;
dfs语义应该是,r,c此处为镜子,然后是以方向f进入到此处的镜子当中
如果是以这个语义,那么在dfs内部算tar时,就不该是按f的方向计算,而应该是按反射后的方向去算
如果dfs语义是,当前r,c节点不为镜子,但是以f方向走的下一个格子是镜子,那么注释中的计算方向就是对的,表示的是起点,但是在调用的时候就不能传入镜子的坐标,而是当前位置的坐标
说白了就是dfs第一层和第二层的区别
DE完后

AI优化
方案一:记忆化 dfs(改动最小)


方案二:倒序预处理 nxt(推荐,无递归)



小Why的循环置换

就是置换环
就是给了一个长度为n的全排列a
然后组成了m个置换环,
假设一个环中有K个元素,最后一次交换能换2个元素归位,前x次交换只能使1个元素归位,x+2=k,最终使这k个元素归位,也就是说一个环有K个元素的环,要交换K-1次
总共有m个环,设每个环上的元素数量为mi
那么∑mi-1就是总的交换次数,然后∑mi为n,所以总的交换次数是n-m