樸素的演算法 o(4096 * 64 * 4096) = o(1e9) 不用想是超時的。
因為每次矩陣乘法中存在很多重複的計算。
考慮將矩陣進行分塊優化。預處理出每塊的值。
怎麼分塊。考慮對a矩陣的列分塊,和b矩陣的行分塊。因為p是公共的邊,且p <= 64
需要注意到的是 b矩陣中的取值僅有01那麼如果對b矩陣進行分塊的話。考慮每塊8個01串。那麼每一塊的取值為[0,255]
於是我們預處理出a[i][j][0,255]的每種取值。i表示a矩陣的i行。j表示每行的第幾塊數。[0,255]表示當前塊與所有01序列的取值。
a切完一共4096*8塊,每塊都預處理出256種情況,預處理的空間是4096*8*256,時間是4096*8*8*256。
那麼在進行乘的時候就按照分好的塊再去做乘法。時間為 4096 * 4096 * 8
#include#define rep(i,a,n) for(int i=a;i<=n;i++)
using namespace std;
const int maxn = 4100;
int a[maxn][70],b[maxn][70];
int ra[maxn][10][260],rb[10][maxn];
char str[70];
int n,p,m;
inline void debug()
rep(i,0,p-1)
}inline void solve()
a[i][j] = temp;
}rep(i,0,m-1)
p = (p-1)/8+1; //將p進行分塊,每8個一塊
rep(i,0,n-1) rep(j,0,p-1)
rep(i,0,p-1) rep(j,0,m-1)
int res = 0;
rep(i,0,n-1) rep(j,0,p-1) rep(k,0,m-1)
printf("%d\n",res);
}int main()
return 0;
}
upc 9541 矩陣乘法 (矩陣分塊)
題目描述 深度學習演算法很大程度上基於矩陣運算。例如神經網路中的全連線本質上是乙個矩陣乘法,而卷積運算也通常是用矩陣乘法來實現的。有一些科研工作者為了讓神經網路的計算更快捷,提出了二值化網路的方法,就是將網路權重壓縮成只用兩種值表示的形式,這樣就可以用一些 trick 加速計算了。例如兩個二進位制向...
BZOJ 2738 矩陣乘法 分塊
標算整體二分,然而窩太弱了並不會做。我們把n n個數排序,然後從小到大插入矩陣,每次插n個,用字首和維護每個子矩陣當前已經填了多少個數。查詢的時候 對於每個詢問,如果子矩陣裡的數已經超過了k個,說明答案在當前插入的這n個數里,倒著查詢即可。用鍊錶維護詢問,已經出解的直接跳過。因為每個詢問最多會查n次...
暴力美學 分塊
cf1017g 給定一棵樹,每次操作乙個點,如果這個點是白色就把他染黑,否則遞迴操作所有兒子。或者把乙個子樹染白。或者詢問某個點的顏色 黑白 把操作以 o n o sqrt n o n 劃分成若干段,把每段涉及到的點建一棵類似虛樹的東西,邊權是兩點之間的白點個數。修改操作在這棵樹上改,複雜度 sqr...