关于矩阵在ACM中的应用


1、矩阵运算法则

重点说说矩阵与矩阵的乘法,不说加减法。

支持:

  • 结合律  (AB)C = A(BC)
  • 分配律 A(B+C) = AB + AB
  • $\left( \lambda A\right) B=\lambda \left( AB\right) =A\left( \lambda B\right) $

2、矩阵乘法的程序实现:

struct matrix
{
double a[][];
} ans, base; matrix multiply(matrix x, matrix y)
{
matrix tmp;
for (int i = ; i < n; i++)
for (int j = ; j < n; j++)
{
tmp.a[i][j] = ;
for (int k = ; k < n; k++) tmp.a[i][j] += x.a[i][k] * y.a[k][j];
}
return tmp;
}

3、矩阵的幂运算可以进行快速幂

  因为矩阵的乘法支持结合律,所以B*A*A*A = B(A*A*A) = B*$A^{3}$

程序实现:

void fast_mod(int k)
{
while (k)
{
if (k & ) ans = multiply(ans, base);
base = multiply(base, base);
k >>= ;
}
}

4、将行列式的变换动作构造成一个矩阵(如 平移 旋转 翻转 等操作)

5、将一个一次递推式 构造出 矩阵。

  例如:fibonacci数列的递推关系 f(n) = f(n-1) + f(n-2)

  我们可以将矩阵构造为:$\left( \begin{matrix} 0& 1\\ 1& 1\end{matrix} \right) \left( \begin{matrix} a\\ b\end{matrix} \right) =\left( \begin{matrix} b\\ a+b\end{matrix} \right) $


比如今天做的一个题目  zoj 2853 Evolution

  它就是先进行构造“进化”这个动作的矩阵。然后有多少次进化就等于"初始物种状态矩阵" 乘 "进化矩阵”

题目 见文末

附上我的代码:

#include<cstdio>
#include<cstring>
int n;
struct matrix
{
double a[][];
} ans, base; matrix multiply(matrix x, matrix y)
{
matrix tmp;
for (int i = ; i < n; i++)
for (int j = ; j < n; j++)
{
tmp.a[i][j] = ;
for (int k = ; k < n; k++) tmp.a[i][j] += x.a[i][k] * y.a[k][j];
}
return tmp;
}
void fast_mod(int k)
{
while (k)
{
if (k & ) ans = multiply(ans, base);
base = multiply(base, base);
k >>= ;
}
}
int main()
{
int m, t, xi, yi;
double s, zi, fin;
int num[];
while (~scanf("%d%d", &n, &m) && !(n == && m == ))
{
for (int i = ; i < n; i++) scanf("%d", &num[i]);
scanf("%d", &t);
memset(base.a, , sizeof(base.a));
for (int i = ; i < n; i++) base.a[i][i] = ; //初始为进化成自己
while (t--)
{
scanf("%d%d%lf", &xi, &yi, &zi);
base.a[xi][yi] += zi;
base.a[xi][xi] -= zi;
}
memset(ans.a, , sizeof(ans.a));
for (int i = ; i < n; i++) ans.a[i][i] = ;
fast_mod(m);
fin = ;
for (int i = ; i < n; i++)
fin += num[i] * ans.a[i][n-];
printf("%.0f\n", fin);
}
return ;
}

6、矩阵在图的邻接矩阵中的应用

  暂时还不会, = =、 以后补上。

Evolution


Time Limit: 5 Seconds      Memory Limit: 32768 KB


Evolution is a long, long process with extreme complexity and involves many species. Dr. C. P. Lottery is currently investigating a simplified model of evolution: consider that we have N (2 <= N <= 200) species in the whole process of evolution, indexed from 0 to N -1, and there is exactly one ultimate species indexed as N-1. In addition, Dr. Lottery divides the whole evolution process into M (2 <= M <= 100000) sub-processes. Dr. Lottery also gives an 'evolution rate' P(i, j) for 2 species i and j, where i and j are not the same, which means that in an evolution sub-process, P(i, j) of the population of species i will transform to species j, while the other part remains unchanged.

Given the initial population of all species, write a program for Dr. Lottery to determine the population of the ultimate species after the evolution process. Round your final result to an integer.

Input

The input contains multiple test cases!

Each test case begins with a line with two integers NM. After that, there will be a line with N numbers, indicating the initial population of each species, then there will be a number T and T lines follow, each line is in format "i j P(i,j)" (0 <= P(i,j) <=1).

A line with N = 0 and M = 0 signals the end of the input, which should not be proceed.

Output

For each test case, output the rounded-to-integer population of the ultimate species after the whole evolution process. Write your answer to each test case in a single line.

Notes

  • There will be no 'circle's in the evolution process.
  • E.g. for each species i, there will never be a path i, s1, s2, ..., st, i, such that P(i,s1) <> 0, P(sx,sx+1) <> 0 and P(st, i) <> 0.
  • The initial population of each species will not exceed 100,000,000.
  • There're totally about 5 large (N >= 150) test cases in the input.

Example

Let's assume that P(0, 1) = P(1, 2) = 1, and at the beginning of a sub-process, the populations of 0, 1, 2 are 40, 20 and 10 respectively, then at the end of the sub-process, the populations are 0, 40 and 30 respectively.

Sample Input

2 3
100 20
1
0 1 1.0
4 100
1000 2000 3000 0
3
0 1 0.19
1 2 0.05
0 2 0.67
0 0

Sample Output

120
0

关于 矩阵在ACM中的应用的更多相关文章

  1. 矩阵快速幂在ACM中的应用

    矩阵快速幂在ACM中的应用 16计算机2黄睿博 首发于个人博客http://www.cnblogs.com/BobHuang/ 作为一个acmer,矩阵在这个算法竞赛中还是蛮多的,一个优秀的算法可以影 ...

  2. ACM 中 矩阵数据的预处理 && 求子矩阵元素和问题

            我们考虑一个$N\times M$的矩阵数据,若要对矩阵中的部分数据进行读取,比如求某个$a\times b$的子矩阵的元素和,通常我们可以想到$O(ab)$的遍历那个子矩阵,对它的各 ...

  3. [ACM训练] ACM中巧用文件的输入输出来改写acm程序的输入输出 + ACM中八大输入输出格式

    ACM中巧用文件的输入输出来改写acm程序的输入输出 经常有见大神们使用文件来代替ACM程序中的IO,尤其是当程序IO比较复杂时,可以使自己能够更专注于代码的测试,而不是怎样敲输入. C/C++代码中 ...

  4. C++ STL泛型编程——在ACM中的运用

    学习过C++的朋友们应该对STL和泛型编程这两个名词不会陌生.两者之间的关系不言而喻,泛型编程的思想促使了STL的诞生,而STL则很好地体现了泛型编程这种思想.这次想简单说一下STL在ACM中的一些应 ...

  5. Java在ACM中的应用

    Java在ACM中的应用 —. 在java中的基本头文件(java中叫包) import java.io.*; import java.util.*; //输入Scanner import java. ...

  6. IO/ACM中来自浮点数的陷阱(收集向)

    OI/ACM中经常要用到小数来解决问题(概率.计算几何等),但是小数在计算机中的存储方式是浮点数而不是我们在作数学运算中的数,有精度的限制. 以下以GUN C++为准,其他语言(或编译器)也差不了多少 ...

  7. ACM中的浮点数精度处理

    在ACM中,精度问题非常常见.其中计算几何头疼的地方一般在于代码量大和精度问题,代码量问题只要平时注意积累模板一般就不成问题了.精度问题则不好说,有时候一个精度问题就可能成为一道题的瓶颈,让你debu ...

  8. ACM 中常用的算法有哪些? 2014-08-21 21:15 40人阅读 评论(0) 收藏

    ACM 中常用的算法有哪些?作者: 张俊Michael 网络上流传的答案有很多,估计提问者也曾经去网上搜过.所以根据自己微薄的经验提点看法. 我ACM初期是训练编码能力,以水题为主(就是没有任何算法, ...

  9. ACM中Java的应用

    先说一下Java对于ACM的一些优点吧: (1) 对于熟悉C/C++的程序员来说Java 并不难学,两周时间基本可以搞定一般的编程,再用些时间了解一下Java库就行了.Java的语法和C++非常类似, ...

随机推荐

  1. 打造H5里的“3D全景漫游”秘籍

    近来风生水起的VR虚拟现实技术,抽空想起年初完成的“星球计划”项目,总结篇文章与各位分享一下制作基于Html5的3D全景漫游秘籍. QQ物联与深圳市天文台合作,在手Q“发现新设备”-“公共设备”里,连 ...

  2. Mesos

    1. 软件定义数据中心 Mesos的二级调度机制: maseos协调每个节点的slave,获取每个节点的机器资源.获取资源后,在相应节点运行framework,在容器中执行任务.从而使得多种类型的服务 ...

  3. arduino 串口实时绘图(以mpu9250为例)

    兴趣之余,利用晚上的时间,做一些个人兴趣方面的开发. 之前没接触过 arduino, 无意之中买了个开发板做一些小开发, 这里利用python 读取 mpu9250 数据实时绘图. 下位机代码 C++ ...

  4. Nginx图片剪裁模块探究

    http://nginx.org/en/docs/http/ngx_http_image_filter_module.html http://cwtea.blog.51cto.com/4500217/ ...

  5. 作品-系统-[原生开发]新蓝景CRM管理系统

    基于ThinkPHP开发 项目网址:http://www.xljchina.com.cn:8839/Admin/Login/login.html 开发性质:原生开发 系统类型:CRM

  6. java和h5 canvas德州扑克开发中(一)

    先附上我的德州扑克测试地址 http://120.26.217.116:8080/LxrTexas/texasIndex.html 我和一个朋友的德州扑克历时一个多月开发,目前已经基本可玩. 前端主要 ...

  7. ERROR actor.OneForOneStrategy: org.apache.spark.SparkContext

    今天在用Spark把Kafka的数据往ES写的时候,代码一直报错,错误信息如下: 15/10/20 17:28:56 ERROR actor.OneForOneStrategy: org.apache ...

  8. "\r\n","\r","\n"

    参考: http://blog.csdn.net/xiaofei2010/article/details/8458605 '\r' : 回车符 '\n' : 换行符 以下是c++语言的测试代码, 跟平 ...

  9. Python 之 threading

    创建多线程常用的三种方法: 创建Thread的实例,传给它一个函数 创建Thread的实例,传给它一个可调用的类实例(不推荐) 派生Thread的子类,并创建子类的实例(推荐) 创建Thread的实例 ...

  10. Java cookie和session介绍与区别

    一.cookie机制和session机制的区别 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案. 同时我们也看到,由于才服务器端保持状态的 ...