博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu - 4920 - Matrix multiplication(缓存优化+开挂)
阅读量:5816 次
发布时间:2019-06-18

本文共 1454 字,大约阅读时间需要 4 分钟。

题意:求两个n x n的矩阵相乘后模3的结果,n <= 800。

题目链接:

——>>呀呀。。

1、3层计算的for进行缓存优化,依据CPU的L1级缓存的实现原理,降低缓存的变更。假设每次都计算完一个单元格的结果再计算下一个单元格的结果。那么被乘矩阵的訪问就会频繁地更新缓存,使效率非常低。。

2、输入开挂,G++提效500ms+。。

3、对乘法进行剪枝。。

没有第1个操作,后果是严重的。。

n^3的复杂度A过,但。此不是正解。。

#include 
#include
const int MAXN = 800 + 10;int n;int A[MAXN][MAXN], B[MAXN][MAXN], mtRet[MAXN][MAXN];int ReadInt(){ int nRet = 0; char cIn; while ((cIn = getchar()) >= '0' && cIn <= '9') { nRet = nRet * 10 + cIn - '0'; } return nRet % 3;}void Read(){ getchar(); for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) { A[i][j] = ReadInt(); } } for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) { B[i][j] = ReadInt(); } }}void Solve(){ memset(mtRet, 0, sizeof(mtRet)); for (int i = 1; i <= n; ++i) { for (int k = 1; k <= n; ++k) { if(!A[i][k]) continue; for (int j = 1; j <= n; ++j) { mtRet[i][j] += A[i][k] * B[k][j]; } } }}void Print(){ for (int i = 1; i <= n; ++i) { for (int j = 1; j < n; ++j) { printf("%d ", mtRet[i][j] % 3); } printf("%d\n", mtRet[i][n] % 3); }}int main(){ while (scanf("%d", &n) == 1) { Read(); Solve(); Print(); } return 0;}

转载于:https://www.cnblogs.com/clnchanpin/p/6918197.html

你可能感兴趣的文章
【案例】主从替换之后的复制风暴
查看>>
SAP 实时产品支持模式:Expert Chat 服务来了!
查看>>
自动升级系统OAUS的设计与实现(续) (附最新源码)
查看>>
Linux 系统健康巡检脚本
查看>>
Word如何设置单元格垂直居中
查看>>
八年前的烈士陵园游感
查看>>
AngularJS应用页面切换优化方案
查看>>
[20150717]备份变大.txt
查看>>
利用ArcGIS Engine、VS .NET和Windows控件开发GIS应用
查看>>
重构——61字段下移(Push Down Field)
查看>>
[20170619]11G expand sql text.txt
查看>>
Yarn源码分析之如何确定作业运行方式Uber or Non-Uber?
查看>>
信号槽库:sigslot.h和sigc++使用
查看>>
微信公众号运营架构图
查看>>
map的erase()释放内存
查看>>
spring-boot | 整合Redis缓存数据
查看>>
国外研究员研发薄而柔韧的新柔性材料 拉伸和压缩可产生电流
查看>>
多进程问题
查看>>
【编程练习】复习一下树的遍历
查看>>
电视台成阿里云下一个大数据重塑目标
查看>>