D. Walk on Matrix
标签
简明题意
- 假设有一个数字矩阵,每次可以向下或向右,问从左上角走到右下角的数字和最多是多少,那么显然这是一个dp。
- 现在不问你数字和,而是把路径上的所有数都&起来,如果还是dp显然是错的。假设dp的到的结果是x,正确答案是y。
- 现在给定k,需要你构造一个矩阵,使得|y-x|=k
思路
- 首先我们思考什么时候dp是错的。假设矩阵中有一个点(x,y)是10101.此时最多两种选择,从(x-1,y)或(x,y-1)转移过来。再假设(x-1,y)是10000,(x,y-1)是101,如下表
? 10000
101 10101
- 那么dp时选择(x-1,y)位置的10000,得到10000,选择(x,y-1)位置的101,得到的是101,根据dp,(x,y)点会选择10000而不是101.
- 现在假设矩阵是这样的(也就是多了一项)
? 10000 ?
101 10101 100
- 10101的结果是10000,那么100选择左边时得到的是0。如果10101选择了101得到101,那么最后得到的结果就是100.由此可见,dp会优先选择使更高的位为1的数。
- 我们可以抓住dp的这个弱点,使得dp结果是0,而正确结果是k。现在思考如何构造。
- 上面的例子中,如果把第一行第三个数填0
? 10000 0
101 10101 100
- 那么不考虑左上角的? dp的结果就是0。现在考虑如何填写?使得dp的结果仍然是0.我们只需要使得10000和101异或上?值不变即可。显然?可以填成111111,使得10000和101都不变。
10101 10000 0
101 10101 100
- 这样的矩阵,dp的答案是0.现在我们想想如何使正确答案为k。显然这里从左上到右下一共有3条路径,分别为
____
| 这一条结果为0
____
|
|_______ 这一条结果非0
________
| 这一条结果为0
|
- 由上可知我们只能操作第二条路径使得第二条路径的结果为k。
- 利用刚才的思路,我们可以让k加上10···0(很大),使得某一步会错误地选择10···0从而异或出很大的10···0。下面这个三角就是,10···0+k选择上面的会形成10···0,而选择左边的k会形成k。
? 10···0
k 10···0+k
? 10···0 0
k 10···0+k k
- 这样,使得两种路径的&都是0,我们现在只需要确定左上角的?给根据上面的举例,?填成1111···111即可。
- 当然也可以填10···0+k,只要使得?下面和右边的数不变就可以了。
- 至于10···0具体是多少,题目说了k<=1e5,那么 2 17 > 1