ACM竞赛学习整理–矩阵运算

了解矩阵类

【任务】

实现矩阵的基本变换

【接口】

结构体:Matrix

成员变量:

int n,m 矩阵大小

int a[][] 矩阵内容

重载运算符: +、-、x

成员函数:void clear() 清空矩阵

【代码】

const int MAXN = 1010;
const int MAXM = 1010;struct Matrix{int n,m;int a[MAXN][MAXM];void clear(){n=m=0;memset(a,0,sizeof(a));}
}Matrix operator +(const Matrix &b) const{Matrix tmp;tmp.n = n;tmp.m = m;for(int i = 0;i<n;++i)for(int j=0;j<m;++j)tmp.a[i][j] = a[i][j] + b.a[i][j];return tmp;
}Matrix operator -(const Matrix &b) const{Matrix tmp;tmp.n = n;tmp.m = m;for(int i = 0;i<n;++i)for(int j=0;j<m;++j)tmp.a[i][j] = a[i][j] - b.a[i][j];return tmp;
}Matrix operator *(const Matrix &b) const{Matrix tmp;tmp.clear();tmp.n = n;tmp.m =b.m;for(int i = 0;i<n;++i)for(int j=0;j<b.m;++j)for(int k=0;k<m;++k)tmp.a[i][j] += a[i][k] * b.a[k][j];return tmp;
}

【扩展】

关于矩阵加速数列递推:

给定一个递推数列

f[i]=a1∗f[i−1]+a2∗f[i−2]…ak∗f[i−k] ,

我们普通计算的话肯定是逐个计算,复杂度较大。

我们可以用矩阵表示:

为了递推出f[n] , 我们需要找到一个系数矩阵 A 使得:

就可以这样计算:

A矩阵可以这样构造:

至此,我们可以愉快地用矩阵加速递推数列了。

参考来源:https://www.cnblogs.com/alecli/p/10004417.html

【应用】

poj 2663详解

Description
In how many ways can you tile a 3xn rectangle with 2x1 dominoes?
Here is a sample tiling of a 3x12 rectangle.

Input
Input consists of several test cases followed by a line containing -1. Each test case is a line containing an integer 0 <= n <= 30.

Output
For each test case, output one integer number giving the number of possible tilings.

Sample Input
2
8
12
-1

Sample Output
3
153
2131

分析题目,这是一个递推关系求解题,并且很容易发现当n为奇数时,无法找到满足题意的铺法,以下仅考虑n为偶数的情况。

思路:
这里先定义两个概念:独立单位和非独立单位。独立单位即不可纵向切割的矩形块, 非独立单位即可纵向切割的矩形块。

我们先来试试几种简单情况。当n = 2时,有3种铺法,如下图。

当n=4时。组合分为两种情况:一种是两个n=2的独立单位组合,另一种是一个n=0的独立单位组合上一个n=4的独立单位。分别如下图。

两个n=2的独立单位组合,比较简单,铺法为3x3。一个n=0的独立单位组合上一个n=4的独立单位,通过画图可以判断,只有两种情况,分别为:

那么n=4的总铺法数就容易确定了,为 3xa[2]+2xa[0] (这里a[0]=1,至于为什么等于1,请读者自己体会)

接下来考虑n= 6,这时有三种组合情况,分别为:

  1. 一个n=4的独立单位连接上一个n=2的独立单位;
  2. 一个n=2的独立单位连接上一个n=4的独立单位;
  3. 一个n=0的独立单位连接上一个n=6的独立单位。
    组合1:铺法为a[4]x3;
    组合2:铺法为a[2]x2;
    组合3:铺法为a[0]x2;
    故n=6时的总铺法数为:a[4]x3+a[2]x2+a[0]x2。
    (有人可能会问为什么要乘以2,这里请读者自行画图求解…)

当n更大时,以此类推。
所以最后我们得出a[n] = 3xa[n-2]+2x(a[n-4]+a[n-6] +…+a[0]),再运用高中所学数列知识,化简得:a[n] = 4a[n-2] - a[n-4];
代码整理如下:

#include<iostream>
#include<string.h>
using namespace std;
const int MAXN=10;
const int MAXM=10;const long long mod = 1000007;
int r;
//矩阵类模板
struct Matrix{int n,m;int a[MAXN][MAXM];void clear(){n=m=0;memset(a,0,sizeof(a));}Matrix operator +(const Matrix &b) const {Matrix tmp;tmp.n=n;tmp.m=m;for (int i=0;i<n;++i)for(int j=0;j<m;++j)tmp.a[i][j]=a[i][j]+b.a[i][j];return tmp;}Matrix operator -(const Matrix &b)const{Matrix tmp;tmp.n=n;tmp.m=m;for (int i=0;i<n;++i)for(int j=0;j<m;++j)tmp.a[i][j]=a[i][j]-b.a[i][j];return tmp;}Matrix operator * (const Matrix &b) const{Matrix tmp;tmp.clear();tmp.n=n;tmp.m=b.m;for (int i=0;i<n;++i)for(int j=0;j<b.m;++j)for (int k=0;k<m;++k){tmp.a[i][j]+=a[i][k]*b.a[k][j];tmp.a[i][j]%=mod;}return tmp;}Matrix get(int x){//幂运算Matrix E;E.clear();E.n=E.m=n;for(int i=0;i<n;++i)E.a[i][i]=1;if(x==0) return E;else if(x==1) return *this;Matrix tmp=get(x/2);tmp=tmp*tmp;if(x%2) tmp=tmp*(*this);return tmp;}
};
//矩阵模板结束int main(){while(cin>>r){if(r==0) break;int a[]= {1,0,3,0};if(r<=3){cout<<a[r]%mod<<endl;continue;}Matrix A;A.clear();A.n=A.m=4;A.a[0][1]=A.a[1][2]=A.a[2][3]=1;A.a[3][0]=-1;//A.a[3][1]=1;A.a[3][2]=4;//A.a[3][3]=1;A=A.get(r-3);Matrix M;M.clear();M.n=4;M.m=1;M.a[0][0]=1;M.a[2][0]=3;M.a[3][0]=0;M=A*M;cout<<(M.a[3][0]+mod)%mod<<endl;}return 0;
}

ps: ACM国际大学生程序设计与竞赛-算法基础(俞勇主编)里有介绍矩阵的实现,刚好手上有个项目要用到矩阵的操作, 一开始想用Eigen 库来实现矩阵的操作,后来想想干脆还是C去实现吧。下午空闲一会了,找了一个ACM的例题来做做。于是就拙了一篇,请大家多指正。

ACM竞赛学习整理--矩阵运算相关推荐

  1. ACM竞赛学习整理开篇之01背包问题

    ACM竞赛学习整理开篇之01背包问题. 最近,偶然的一次机会让我关注信息奥赛的一些内容.发现其中的内容很有趣,是学习编程的一条很好的路径,又能很好地将数学和编程联系到一起.在csdn里看到了不少同好也 ...

  2. ACM竞赛学习整理--模拟算法举例POJ1068

    什么是模拟 仅仅使用较简单的算法和数据结构的题目. 模拟顾名思义,就是按照题目的要求,一步步写出代码. 常见的模拟方法 a.用数学量和图形描述问题 计算机处理的是数学量.若要用计算机解决实际问题,需要 ...

  3. ACM竞赛学习整理--Gauss求解POJ1166

    这道题目和1830比较类似,1830是求解的个数,这道题目相当于求线性方程组的整数解. 题目主要内容:有9个钟,其中9个操作方法来扳动上面的指针,每个操作每次只能把指针移动90度,且每个操作是对一组钟 ...

  4. ACM竞赛学习指南(算法工程师成长计划)

    算法工程师成长计划 近年来,算法行业异常火爆,算法工程师年薪一般20万-100 万.越来越多的人学习算法,甚至很多非专业的人也参加培训或者自学,想转到算法行业.尽管如此,算法工程师仍然面临100万的人 ...

  5. NOIP竞赛学习整理--动态规划算法举例P1264

    动态规划 什么是动态规划? 动态规划是解决多阶段决策最优化问题的一种思想方法.所谓"动态",指的是在问题的多阶段决策中,按某一顺序,根据每一步所选决策的不同,将随即引起状态的转移, ...

  6. ACM竞赛学习记录------迷宫寻宝(BFS广度优先搜索)

    题目 洪尼玛今天准备去寻宝,在一个n*n (n行, n列)的迷宫中,存在着一个入口.一些墙壁以及一个宝藏.由于迷宫是四连通的,即在迷宫中的一个位置,只能走到与它直接相邻的其他四个位置(上.下.左.右) ...

  7. ACM如何入门,ACM竞赛需要学习哪些算法?

    #################成绩################## 大一:2017年4月份"玲珑杯"河南工业大学2017年ACM程序设计大赛暨河南高校邀请赛,获得银奖 20 ...

  8. 信息学竞赛学习资料整理

    信息学竞赛学习资料整理 一.总结 一句话总结:可以在网上获取各种免费视频资源,网上超多,也可以买书,也可以去刷题网站多做题 1.信息学竞赛书籍推荐? 信息学竞赛一本通 算法导论 组合数学 <CC ...

  9. 22南工计算机学院新生培训最终章---ACM竞赛机制

    文章目录 前言 前文 一.程序竞赛种类 二.ACM赛制 1. 简介 做题反馈 排名根据 三.其他竞赛 1.OI赛制 做题反馈 排名根据 2.IOI赛制 做题反馈 排名根据 四.一些帮助 网站分享 1. ...

最新文章

  1. abc类计算机,计算机科学ABC类会议分类表
  2. 数据恢复:解决ORA-600[kghstack_free2][kghstack_err+0068]一例
  3. Linux之文件查找命令
  4. OpenCV使用CNN进行目标检测
  5. CSS3实战开发: 纯CSS实现图片过滤分类显示特效
  6. Python(13)-函数,lambda语句
  7. php 匹配关键字,php获取搜索引擎搜索关键词关键字的正则表达式实现方法
  8. unix查询内存使用率_Elasticsearch高级调优方法论之——根治慢查询
  9. centos安装词典——图形界面的和命令行
  10. 【.NET】XML文件的创建,修改,删除
  11. 远程服务器格式化,怎么远程服务器做ghost备份图解
  12. modelsim se 10.5安装教程
  13. 魔兽世界私服Trinity,从源码开始
  14. java 修改文件编码_java中怎么获取、设置文件编码格式?
  15. 工业互联网,姓工,名互
  16. 关于数据库、数据治理、AIOps的这些痛点,你需要知道! | DAMS 2020
  17. markdown中插入数学公式
  18. web前端学习(三):微信小程序基于H5规范,开发Android应用程序
  19. 小米3c路由器拆机_路由器也智能,小米路由器3C使用心得 - IT168试客
  20. android如何加密手机号码,手机如何加密?

热门文章

  1. linux脚本编程(shell)浅介
  2. [云炬创业基础笔记]第二章创业者测试5
  3. [云炬创业基础笔记]第五章创业机会评估测试2
  4. 使用wdcp面板安装感恩教师节wordpress网站
  5. 通俗易懂讲解RBF网络
  6. Python类与对象技巧(2):拓展子类属性
  7. SVM熟练到精通5:MATLAB实例
  8. 生活中人人都是主角,也都不是主角
  9. linux中以A开头的函数使用方式历程及详解
  10. Thymeleaf 标准表达式语法