HDU 5411
題意:
Count the number of different patterns by counting the number of different paths of length at most m-1.
思路:
其實這類問題就是求:
S=I+A+A2+...+Am
一般普適的計算方式是:
(AmS)=(AI0I)m∗(I0)
這樣做的好處是可以得到最後的矩陣S,然後求S的所有元素和即是答案-1(沒統計∅),不過這題n <= 50 ,矩陣大小可能會超過100*100,時間復雜度將達到O(N3logM)再加上數據有20組,會被卡常數TLE,但有一個辦法就是將矩陣乘法的取模操作從最內層移到第二層(因為mod只有2015,也就是說矩陣最大元素只有2014,最內層的乘法加法操作不會爆int),可以進行一定常數優化,,剛好可以卡著時間AC(大概480ms)
但是這題並不需要我們求出最後的加和矩陣S,僅需要它的各項元素和即可,那麼我們可以把這個矩陣簡化成這樣(假設鄰接是個四階矩陣):
????????11A1100001????????m=????????a1a2Ama3a40000a5????????
ans=∑ni=1ai
這樣做就避免了空間的浪費,且保留下來了答案,當然這裡初始矩陣的最下面一行1也可以放去最上層,最左層,最右層,因為是計算Ak所有元素和,並無影響。
這種做法復雜度與之前一致,但因為矩陣大小降了近乎一半,耗時相對少了很多(大概93msAC)
代碼:
方法1:
/*
* @author FreeWifi_novicer
* language : C++/C
*/
#include
#include
#include
#include
#include
#include
#include
#include
方法2:
/*
* @author FreeWifi_novicer
* language : C++/C
*/
#include
#include
#include
#include
#include
#include
#include
#include