设为首页 加入收藏

TOP

hdu - 4920 - Matrix multiplication(缓存优化+开挂)
2015-07-20 17:46:14 来源: 作者: 【 】 浏览:4
Tags:hdu 4920 Matrix multiplication 优化 开挂

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4920

――>>呀呀。。

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


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇LeetCode 63 Minimum Path Sum 下一篇[NOIP 2014复习]第二章:动态规划..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·新书介绍《Python数 (2025-12-25 04:49:47)
·怎么利用 Python 进 (2025-12-25 04:49:45)
·金融界大佬力荐,Pyt (2025-12-25 04:49:42)
·你必须要弄懂的多线 (2025-12-25 04:22:35)
·如何在 Java 中实现 (2025-12-25 04:22:32)