POJ-3734 Blocks

原创 2016年08月30日 20:17:09

题目大意:

有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;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

poj-3734

挑战算法程序设计的例题 描述见问题出处 AC代码: #include #include #include #include #include #include u...
  • su_ren
  • su_ren
  • 2017年07月15日 20:56
  • 165

Intel Threading Building Blocks

之前说准备写点TBB的内容,就先做个简介吧:TBB,Threading Building Blocks,是Intel推出的针对多线程并行开发的一个library,open source,遵循GPLv2...
  • zoufeiyy
  • zoufeiyy
  • 2007年11月11日 20:27
  • 23729

hadoop异常处理--namenode抛出missing blocks

异常描述 missing blocks 解决方案 hadoop fsck -delete 可以移除 missing block 如果备份数>=3,一般直接删除即可,如果没有冗余数据,可能会很...
  • slx_2011
  • slx_2011
  • 2014年02月21日 18:40
  • 1641

hadoop学习笔记(9)-Number of Under-Replicated Blocks问题

跑了一个mapreduce发现集群上出现了7个Under-Replicated Blocks,在web页面上能看到,在主节点上执行: $ bin/hadoop fsck -blocks 也能看...
  • bhq2010
  • bhq2010
  • 2013年03月22日 00:19
  • 7179

Number of Under-Replicated Blocks问题

跑了一个mapreduce发现集群上出现了7个Under-Replicated Blocks,在web页面上能看到,在主节点上执行: [html] view plaincopy ...
  • Mrknowledge
  • Mrknowledge
  • 2014年03月06日 09:36
  • 1607

spark调优经验(待续)

spark 调优经验笔记! spark 存储的时候存在严重的分配不均的现象,有几台机器在过渡使用, 有几台机器却很少被使用,有几台机器缓存了几十个上百个RDD blocks  有的机器一个RDD bl...
  • lgandzmy
  • lgandzmy
  • 2014年10月29日 21:31
  • 1899

iOS中Blocks的介绍

1. 什么是Blocks       Blocks是C语言的扩充功能。如果用一句话来概括就是:带有自动变量的匿名函数。       第一次看见Blocks的时候,感觉很类似C语言的函数指针,尤其是...
  • sakulafly
  • sakulafly
  • 2013年12月28日 14:29
  • 4469

error: do_inode_allocate_extents: Failed to allocate 4133 blocks

Android在打包生成system.img的过程中报错提示: Size: 859832320     Block size: 4096     Blocks per group: 32768 ...
  • ncepu307
  • ncepu307
  • 2014年07月16日 16:16
  • 2766

The ratio of reported blocks 0.0000 has not reached the threshold 0.9990. Safe mode will be turned o

Hadoop集群启动的时候一切正常,但一直处于safemode,只能读不能写,这种时候应该查看namenode的logs,当然这可能会出现不同的情况... 下面仅介绍一种错误处理方案,希望能抛砖引玉,...
  • senvil
  • senvil
  • 2015年10月04日 09:02
  • 805

Xcode 7.1, Build Settings,No Common Blocks备忘

Xcode 7.1, Build Settings,No Common Blocks备忘
  • cutesnail
  • cutesnail
  • 2016年01月08日 09:37
  • 2097
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ-3734 Blocks
举报原因:
原因补充:

(最多只允许输入30个字)