ACM训练日记—1月30日

本文介绍了如何使用高斯消元法解决点灯染色问题,通过构造矩阵模型,采用两种不同的方法进行求解。方法一通过建立增广矩阵并运用高斯消元法求解;方法二则是利用状态之间的关系,建立列向量方程组求解。

        今天看了高斯消元的题目,感觉看的有点慢,发现看完发现全都是关于点灯染色的题目,记得曾经做过一道概率的题目也可以用高斯消元解,只是没有点灯那么难。

       总的来说今天看的题目解题方法分为三种,一种使用枚举的这个我不说了,另外两种都是关于高斯消元的,是对矩阵模型的两种应用。

方法一:    就像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种),其实复杂度和深搜一样的。


明天继续补高斯消元不同种的题目。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值