zoukankan      html  css  js  c++  java
  • POJ-3734 Blocks

    题目大意:

    有n个blocks,让你用红,蓝,绿,黄四种颜色染上色,其中红色和绿色的block都是偶数个的方案有多少个。

    解题思路:

    其实这是个DP...啊一脸狗血...

    其实模型很像这题....HDU 1143 Tri Tiling

    首先,假设dp[i][0]表示当涂了前i个blocks之后,红色和绿色都是偶数个的方案个数,dp[i][1]表示当涂了前i个blocks之后,红色和绿色只有一个是偶数个的方案个数,dp[i][2]表示当涂了前i个blocks之后,红色和绿色都不是偶数个的方案个数

    那么状态转移为:

    dp[i+1][0] = 2 * dp[i][0] + dp[i][1] 

    表示涂了前i+1个之后红色和绿色都是偶数个,那么前i个可以是红色和绿色都是偶数个,第i+1个选择蓝色或黄色,或者前i个是红色和绿色有一个是偶数个,那么第i+1个选择为不是偶数个的那一个。

    以此类推。得出所有的状态转移:

    dp[i+1][0] = 2 * dp[i][0] + dp[i][1]

    dp[i+1][1] = 2 * dp[i][0] + 2 * dp[i][1] + 2 * dp[i][2]

    dp[i+1][2] = dp[i][1] + 2 * dp[i][2]

    如果你以为就这么结束那真是亦可赛艇...这题关键在于n数量级极大,即使你用滚动数组去维护依旧无法拜托超时的厄运。所以需要加速。

    于是矩阵快速幂诞生了。(xjb扯的

    怎么转换矩阵快速幂可以参考斐波那契数列...

    代码:

    #include <cstdio>
    #include <cstring>
    using namespace std;
    
    const int mod = 10007;
    typedef struct node {
    	int mat[4][4];
    	node() { memset(mat, 0, sizeof(mat)); }
    }Matrix;
    
    Matrix operator * (Matrix a, Matrix b) {
    	Matrix ans;
    	for (int i = 0; i < 3; ++i)
    		for (int j = 0; j < 3; ++j)
    			for (int k = 0; k < 3; ++k)
    				ans.mat[i][j] = (ans.mat[i][j] + a.mat[i][k] * b.mat[k][j]) % mod;
    	return ans;
    }
    Matrix operator ^ (Matrix a, int num) {
    	Matrix ans;
    	for (int i = 0; i < 3; ++i) ans.mat[i][i] = 1;
    	while (num) {
    		if (num & 1) ans = ans * a;
    		a = a * a;
    		num >>= 1;
    	}
    	return ans;
    }
    int main() {
    	int n, t;
    	scanf("%d", &t);
    	while (t--) {
    		Matrix m;
    		scanf("%d", &n);
    		m.mat[0][0] = 2; m.mat[0][1] = 1; m.mat[0][2] = 0;
    		m.mat[1][0] = 2; m.mat[1][1] = 2; m.mat[1][2] = 2;
    		m.mat[2][0] = 0; m.mat[2][1] = 1; m.mat[2][2] = 2;
    		m = m ^ n;
    		printf("%d
    ", m.mat[0][0]);
    	}
    	return 0;
    }


  • 相关阅读:
    flask与Django的区别
    flask特殊装饰器
    flaskjinjia2模板
    flask类视图
    flask路由系统
    flask初识
    python2与python3 的安装与环境变量的添加
    WebGL_0007:强制横屏的参考
    NodeJS_0011:nodejs重定向到一个链接或本地的页面的方法
    NodeJS_0006:nodejs响应超时处理
  • 原文地址:https://www.cnblogs.com/wiklvrain/p/8179364.html
Copyright © 2011-2022 走看看