2015蓝桥杯省赛——叠骰子(第9题,矩阵快速幂)

该题若用DP做,时间复杂度为o(n),无法通过数据规模为10^7以上的数据;所以应采用快速矩阵幂来处理。
1、思想
矩阵快速幂的思想就是跟数的快速幂一样,假如我们要求2^11,次方,我们可以把 11 写成 1+2+8 ,也就是2^0 + 2^1 + 2^3 。那么把一个O(n)的时间复杂度降到了log(n)
矩阵快速幂的思想和数的快速幂是一模一样的,就是要自己实现矩阵的乘法,然后可以套数的快速幂的模板。
2、难点
矩阵题目的难点在于构造矩阵,一般用于有能够推出递推式的题目,推出递推式之后,发现递推O(n)的复杂度时间比较大,那么我们可以构造一个矩阵,然后用矩阵快速幂降低到log(n)的时间复杂度。

线性组合的奇妙:

在讲如何用矩阵来优化动态规划算法之前, 我先引入一个新的例子来表达矩阵乘法的奇妙之处. 相信大家都曾经接触过斐波那契数列,数列定义如下:

1)  F(0) = 0, F(1) = 1;

2)  F(n) = F(n-1) + F(n-2);  [ n > 1 ]

相信但凡学过递归的同学都接触过该数列, 但是我们一般的解法都是以带记忆数组的递归来求解, 不过, 这个很特别的数列确是可以以矩阵来求解的, 看看下面的矩阵递归式:

子十分神奇吧!! 通过对矩阵乘法的巧妙应用, 我们可以写成如此精致的递归式 . 仔细分析, 其实中间的矩阵的列向量是十分特别的, 它以近乎完美的方式对左边矩阵中的点值进行了有机性的取舍, 从而演变出了右边的矩阵. 而右边的矩阵与左边的矩阵又具有相似的结构, 所以, 递归式可以无限地演变下去. 上述的式子还可以继续精简 :


通过以上演变, 我们把斐波那契数列的求解变成了求矩阵的幂, 这时候, 矩阵快速幂的算法就派上用场了, 最后, 我们便可以在O( log(2)(N) ) 【以2为底】的复杂度内求解数列.

在本题的动态规划解法中,我曾经说过,以dp[ i ][ j ]来表示在高度为i的情况下,骰子柱顶面点数为j的总方案数, 然后,dp[ i ][ j ]的值将等于前一高度所有方案的选择性累加,一说到选择性累加,是不是十分类似于上述例子中的那个只包含0和1的矩阵 ? 在上述的斐波那契例子中,那个只包含0和1的矩阵就是这样通过列向量的0或1对左边矩阵进行选择累加,从而得出右边矩阵的。那么,我们也可以通过类似的结构来完成对骰子方案的选择性累加。

接下来,我们需要沿用在DP解法中提到的冲突数组,因为冲突数组实际上就是我们的选择性累加,在这里,我们将它变为冲突矩阵。

递推式:设dp[ i ][ j ]表示第 i 个骰子 j 面朝上的摆法有几种


递推矩阵:(根据递推式很容易可以写出)


矩阵T中 元素 T[ i ][ j ] 表示 i 面和 j 面的冲突关系。

矩阵A中 元素A[ 1 ][ j ]表示 第1个骰子,j 面朝上的摆法有多少种。

最后,当一个面朝上的时候,骰子可以四转,所以最后要在得出的结果乘以 4^n。

#include
#include
#include

#define mod 1000000007

struct matrix{  //矩阵 
	long long v[6][6];
	
	matrix(){ //若不加该函数,则会出错,因为main中的ans未初始化;
			  //C++中struct相当于特殊的class,可以定义构造函数  
		memset(v,0,sizeof(v));
	}
};

matrix mul(matrix x,matrix y) //矩阵乘法  
{
	matrix ans;
	
	for(int i=0;i<6;i++)
		for(int j=0;j<6;j++)
			for(int k=0;k<6;k++)
				ans.v[i][j] = (ans.v[i][j]+x.v[i][k]*y.v[k][j])%mod;

	return ans;
}

matrix fastm(matrix x,int k) //矩阵快速幂  
{
	matrix ans;
	
	for(int i=0;i<6;i++) //对角线置1 
		ans.v[i][i] = 1;
		
	while(k){
		if(k & 1)
			ans = mul(ans,x);
		x = mul(x,x);
		k >>= 1; //==k/2
	}
	return ans;
}

int main()
{
	int a,b,n,m;
	matrix t,ans;
	
	for(int i=0;i<6;i++)
		for(int j=0;j<6;j++)
			t.v[i][j] = 1;	
	scanf("%d%d",&n,&m);
	
	for(int i=0;i

参考:http://blog.csdn.net/lonverce/article/details/45169285

http://blog.csdn.net/qq_34594236/article/details/53616283



你可能感兴趣的:(竞赛准备题)