POJ-3734 Blocks
来源:互联网 发布:八孔竖笛淘宝 编辑:程序博客网 时间:2024/05/16 01:59
题目大意:
有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\n", m.mat[0][0]);}return 0;}
0 0
- poj 3734 Blocks 矩阵
- POJ-3734-Blocks
- POJ 3734 Blocks
- POJ 3734-Blocks
- poj 3734 Blocks
- POJ 3734 Blocks
- POJ 3734Blocks
- POJ 3734 Blocks
- POJ-3734 Blocks
- poj 3734 Blocks
- POJ 3734 Blocks 笔记
- POJ 3734 Blocks 矩阵乘法
- poj 3734 Blocks 组合计数
- POJ 3734 Blocks 组合数学
- POJ 3734 Blocks DP优化
- Blocks (POJ
- Blocks - POJ 3734 矩阵乘法递推
- poj 3734 Blocks 【矩阵快速幂】
- 【年中总结】——愿有人陪你颠沛流离
- 爬梯积累:IT公司管理者、TeamLeader了解一下
- Redis常见集群方案、Codis实践及与Twemproxy比较
- 文件管理-外存分配方式
- 微信公众平台开发——2、代码模式学习总结,接入自己的服务
- POJ-3734 Blocks
- (第6讲)servlet 分页技术
- day21操作字节数组流,编码解码
- java实现在同一Excel文件上写数据
- sql查询 同一个字段 同时满足多个条件
- python 安装jieba...
- 威佐夫博弈模板
- Sorting Algorithm-PreKnowledge
- leetcode-python 第十周