问题描述: 用1 * 1, 1 * 2的矩形覆盖一个n行m列的矩形,问有多少种方法。

数据范围 : n [1..10^6],  m [ 1..7]

要求复杂度: 时间  O(log(n) * 8 ^m))  空间  O(4^m)

分析:这个题跟之前那个木块砌墙问题一样…… 稍作修改即可,又是矩阵乘法。

http://blog.csdn.net/caopengcs/article/details/9928061

代码:

// you can also use includes, for example:
// #include <algorithm> #include <vector> vector<vector<int> > a; const int MOD = 10000007; int add(int x,int y) {
return ((x += y) >= MOD)?(x - MOD):x;
} int mul(long long x,long long y) {
return x * y % MOD;
} vector<vector<int> > mulmatrix(vector<vector<int> > &a,vector<vector<int> > &b) {
vector<vector<int> > c;
int n = a.size(), i ,j, k;
c.resize(n);
for (i = 0; i < n; ++i) {
c[i].resize(n , 0);
for (j = 0; j < n; ++j) {
for (k = 0; k < n; ++k) {
c[i][j] = add(c[i][j], mul(a[i][k],b[k][j]));
}
}
}
return c;
} void count(int col, int n, int last, int now) {
if (col >= n) {
++a[last][now];
return;
}
count(col + 1, n, last, now);
if (((last & (1 << col)) == 0) && (col + 1 < n) && ((last & (1 << (col + 1))) == 0)) {
count(col + 2, n, last, now | (3 << col));
}
} int solution(int N, int M) {
// write your code here...
int i,total = 1 << M;
vector<vector<int> > r;
a.resize(total);
r.resize(total);
for (i = 0; i < total; ++i) {
a[i].resize(total, 0);
count(0, M, i, 0);
r[i].resize(total, 0);
r[i][i] = 1;
}
for (; N ; N >>= 1) {
if (N & 1) {
r = mulmatrix(r, a);
}
a = mulmatrix(a, a);
} return r[0][0]; }

codility上的问题 (22)的更多相关文章

  1. codility上的练习 (1)

    codility上面添加了教程.目前只有lesson 1,讲复杂度的……里面有几个题, 目前感觉题库的题简单. tasks: Frog-Jmp: 一只青蛙,要从X跳到Y或者大于等于Y的地方,每次跳的距 ...

  2. codility上的问题(15) Xi 2012

    进入2012年的题 codility上的题目开始变难,变得有意思起来.给定两个长度在[1..300000]的只包含0和1的串S和T,它们是2进制表示的,S表示的数A不大于T表示的数B,即A<=B ...

  3. codility上的练习(5)

    codility出了lesson 5了. (1) 合法括号序列,包括( [ { ) ] }这6种字符的字符串,长度N在[0..200000]范围内,为其是否合法. 要求时间复杂度O(N),空间复杂度O ...

  4. codility上的问题(34) Fluorum 2014

    好久没写codility的题了.一来没时间,二来有的题目不太好分析.这个题比較有意思,我还没有给出很严格的证明.

  5. codility上的问题 (19)Sigma 2012

    题目: 像最大直方图一样给定一个数组是每个单位长度上的高度,求至少几个矩形可以拼出这个形状. 例如:给出的数组 H[0] = 8 H[1] = 8 H[2] = 5 H[3] = 7 H[4] = 9 ...

  6. codility上的问题 (21) Upsilon 2012

    这是我目前最喜欢的codiltiy上的问题之一.问题描述是:给定一个整数数组A,所有的数均不相同.假设下标从0开始,找到一个数组B, 满足A[B[0]] > A[B[1]] > A[B[2 ...

  7. codility上的问题 (23)Chi 2012

    这个题也比较有意思.意思是给定一个数组A,长度为M,里面都是正整数,代表每块地形的高度.现在要测试一种加农炮,给定一个炮弹的高度H, 如果存在最小的I,满足0 < I <  M,满足A[I ...

  8. codility上的练习(3)

    今天发现又出了lesson 3... 不过题目都很简单…… (1) Min-avg-slice 给定一个长度为n的整数数组,找到一个连续的子数组,数组元素的平均值最小. 数据范围N [1..10^5] ...

  9. codility上的问题(26) Hydrogenium 2013

    题目,挺无聊的.一个裸的最短路.n个点,你住在0,要去买东西,每个点有一个关门时间,问能最早买到食物的时间.有两点注意 (1)有重边 (2) 原图是dicrect连接...但不是有向边,被这个误导了. ...

随机推荐

  1. WPF - Build Error总结

    1. are you missing an assembly reference 给项目添加新控件的时候,经常发现这种错误 Error 21 The type or namespace name 'C ...

  2. 使用JS截取字符串函数详解

    一.函数:split() 功能:使用一个指定的分隔符把一个字符串分割存储到数组 例子: str=”jpg|bmp|gif|ico|png”; arr=theString.split(”|”); //a ...

  3. ubuntu14.04折腾迅雷xware

    迅雷一直没有出linux版,wine不想去弄.linux下虽然也有各种bt软件,无奈我试用后却发现速度远比不上迅雷,甚至有些资源根本找不到.而有些迅雷的专用链接,更是没法下(原谅我2M的小水管,却喜欢 ...

  4. HTML特殊符号显示技巧

    转:http://www.cnblogs.com/JessonChan/archive/2011/08/06/2129170.html HTML符号 显示一览表.编辑博客的时候经常会用到.特别是空格( ...

  5. [原创作品] Express 4.x 接收表单数据

    好久没有写博客,从现在开始,将介绍用nodejs进行web开发的介绍.欢迎加群讨论:164858883. 之前的express版本在接收表单数据时,可以统一用res.params['参数名'],但在4 ...

  6. [WebStrom] Cannot detect file change to trigger webpack re-compile

    Working with editors/IDEs supporting “safe write” Note that many editors support “safe write” featur ...

  7. Windows下使用ODBC API访问数据库之关键

    本文采用SQL2005 + VS2008环境,以ODBC API方式成功连接数据库. 1.SQL安装和环境配置 这部分网上随便搜一下都有很多资料,而且很容易就可以配置成功. 注意的关键点: SA账号配 ...

  8. 0301——Notification 通知

    注册消息 [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(方法) name:@"消息名字&q ...

  9. OD学习笔记10:一个VB程序的加密和解密思路

    前边,我们的例子中既有VC++开发的程序,也有Delphi开发的程序,今天我们给大家分析一个VB程序的加密和解密思路. Virtual BASIC是由早期DOS时代的BASIC语言发展而来的可视化编程 ...

  10. 6 log4j -- 一个笨的使用方法

    log4j的说明: Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件,甚至是套接口服务器.NT的事件记录器.UNIX Syslog ...