今天看了高斯消元的题目,感觉看的有点慢,发现看完发现全都是关于点灯染色的题目,记得曾经做过一道概率的题目也可以用高斯消元解,只是没有点灯那么难。
总的来说今天看的题目解题方法分为三种,一种使用枚举的这个我不说了,另外两种都是关于高斯消元的,是对矩阵模型的两种应用。
方法一: 就像poj1681 来自http://blog.youkuaiyun.com/yp_2013/article/details/69665835
解题思路:
我们可以首先来构造一个矩阵,这个矩阵式干啥的呢,我们可以认为这个矩阵是按下一个格子之后它能够作用的范围,将能够作用的范围用1表示否则用0表示。来举个例子
就 根据一个3*3的矩阵,对于第一行第一列的元素来说,它可以影响的范围是它自己 还有它的右面的值和它的下面的值,矩阵中其余的值都是0,也就是说
A(0,0)=
1 1 0
1 0 0
0 0 0
A(0,1)=
1 1 1
1 0 0
0 0 0
现在我们设一个L矩阵,表示初始的状态,如果是y就是0,否则就是1,也就是说我们需要将当前的矩阵操为全是0的矩阵
L + x(1,1)*A(1,1) + x(1,2)*A(1,2) + x(1,3)*A(1,3) + x(2,1)*A(2,1) + … + x(3,3)*A(3,3) = 0 (1)
上述 方程的 x 表示的是一个未知数,因为我们不知道是否是按下这个按钮。那么x(i, j)=0表示不按,否则表示按。那么我们现在就是求一个这样的方程解最小的x,那么上述方程中的矩阵A可以用一个比较大 的矩阵n*n的来表示,然后就是转换一下关系就行了(具体在代码中有体现)。那么现在就是n个未知数,n个方程,在(1)中,可以两边加上L,那么就是变成了:
x(1,1)*A(1,1) + x(1,2)*A(1,2) + x(1,3)*A(1,3) + x(2,1)*A(2,1) + … + x(3,3)*A(3,3) = L(2)
依据矩阵每一种状态建立新矩阵,就像上题,还要继续将其化出来,比如第一个式子应该是x1+x2+x3=L(1,1),依次化出来,建立增广矩阵,然后用高斯消元解出来。
方法二:
这种方法主要就是利用关系,a(i,j)表示j位置变化是否对i位置有影响,如poj1830,
来自:http://blog.youkuaiyun.com/qq_33879506/article/details/53192909
将矩阵每一列想象为一个开关按下后产生的效果(1表示状态翻转,0表示不变),比如,第二列就表示按下第二个开关,则第二个开关的本身状态要改变(这就是把对角线0换成1的原因),受第二个开关影响的开关j状态也要改变,恰好对应邻接矩阵中A[j,
2]=1
把A写成分块矩阵的形式,每一列作为一个子矩阵,则有A=[a1, a2, a3],此处ai均为列向量,设第i个开关按下次数为xi,xi=0或1(开关按两下和没按是等效的,0/1就够了)
记初始状态b0=[0,0,0],最终状态b1=[1,1,1],则状态变化b=b0^b1=[1,1,1],这里b也是列向量。目标就是求x1a1 + x2a2 +x3a3 = b的解的个数(此处的加是模2加,也就是异或,下同)
还有像poj1753利用状态压缩枚举所有变元的情况(2^k种),其实复杂度和深搜一样的。
明天继续补高斯消元不同种的题目。
本文介绍了如何使用高斯消元法解决点灯染色问题,通过构造矩阵模型,采用两种不同的方法进行求解。方法一通过建立增广矩阵并运用高斯消元法求解;方法二则是利用状态之间的关系,建立列向量方程组求解。
1188

被折叠的 条评论
为什么被折叠?



