首页 > 代码库 > HDU4949 Light (轮廓线dp)

HDU4949 Light (轮廓线dp)

题意:给你一个01矩阵,有两种操作:

第一种: 把a(i,j)的周围四个都异或一下

第二种: 把a(i, j)的周围四个和a(i,j)都异或一下

求把矩阵变成全0矩阵的最少操作次数


思路:如下图所示的轮廓线dp,逐格递推的,cur为当前决策的格子,红色线就是轮廓线,轮廓线以上的格子的操作状态都已经确定了,而对下面状态有影响的只有黄色格子,每个格子保存的是格子当前的数和它自己操作了多少次,因为无论是1还是2操作,对其他格子的影响都是一样的,这样子的复杂度是O(n*m*4^10),明显是会超时的。然后就是要想办法降低复杂度了,up这个格子如果当前状态是1,那么它还需要cur这个格子操作奇数次使得它达到0状态,也就是说cur格子必须要操作一次,那么up格子自己的操作次数实际上已经没用了,因为不管cur各种操作一次可以异或自己也可以不异或自己,所以cur这个格子可以是0也可以是1。那么就是说只有每个格子只有三种状态了,分别是格子是1,格子是0并且自己操作0次,格子是0并且自己操作了1次。需要注意的是left还是需要保存四个状态的,因为cur会影响left的状态。复杂度为O(n*m*4* 3^9)


code:

<script src="https://code.csdn.net/snippets/451384.js" type="text/javascript"></script>