矩陣!!,矩陣
今天師兄被老廖喊著來給我們講經驗總結,他講的矩陣,這東西從前聽了就怕,碰都不想碰,今天接觸了一下,喲,這個feel倍兒爽!
矩陣用來解決問題往往有意想不到的效果!
第一個例子,斐波那契數列,大家不陌生吧?F[N]=F[N-1]+F[N-2];要你求F[N],其中N很大,大到1E10,大哥們,有木有蛋疼的?當時我也碰到過這樣的題目,不過被我默默滴越過去了- -!現在好了,聽了這個矩陣的做法,尼瑪,還真是很好解決啊!
建立這樣一個矩陣A
| F[N-2] |
| F[N-1] |
然後要求出來的是這樣一個矩陣B
| F[N-1] |
| F[N] |
然後推出一個與第一個矩陣相乘等於第二個矩陣的矩陣C
| 0 1 |
| 1 1 |
矩陣乘法我可就不詳細說了啊,自己弄明白再來學這個— —!
應用以上這點資訊可以建立公式
AxC=B
我們很容易知道F[1]、F[2]的,作死滴誠意C不就可以得到想要的了嗎?
AxC^N=B
然後對於C用快速冪模數演算法處理,不就很快了?
下面是學長的第二個例子,我記得好像是那個路徑問題
題目:給你地圖map[ ][ ],要你求出從A走K步走到B的方案數。
尼瑪,坑爹哦,記得杭電那個題不?就是正好要一定步數走到終點才行,題號我倒是忘記了,嘎嘎!
用我們一般做題的想法來做的話還真是會麻煩到死,麻煩就算了,代碼敲起來如果思維不清晰,一下子就暈死在河邊上,你就作死的糾結去吧,下面說說用矩陣來做吧!
地圖是用二維矩陣裝的,那就直接用它做文章,假設輸入是這樣的,a b表示a到b有一條通路
輸入:(4*4的地圖)
1 2
1 3
2 3
2 4
3 4
於是就有了map[ ][ ]:
| 0 1 1 0 |
| 1 0 1 1 |
| 1 1 0 1 |
| 0 1 1 0 |
map[X][Y]=1表示X和Y之間有通路
如果直接用map X map呢?
就拿求出的矩陣的第一行第一列結果的由來來說,它是由第一行乘以第一列得來的,什麼含義咧?首先是看行,表示的是城鎮1能去的城鎮,而從列來看,表示的是能夠來1城鎮的城鎮,所以能否看出“x行y列結果就是x去y的方案數,每次乘以矩陣map就等於走兩步”?
我有我自己的理解,《從i去j經過k》,相乘中取用 i 行中那個 i 就是起點,取用的 j 列就是終點,k就是 i 行中的各個 j ,比如上面的第一行第一列就是從1去1分別經過2,3兩個點,這樣能懂不?不懂就再看一遍,如果還是不懂我就告訴你,你有點蠢!
這種方法還能求最短路,本來是行列各個單元相乘的結果相加就是求這個方案數,現在不相加,直接取最小的那個,好好想想,是不是最短路了??嘎嘎
哎呀,寫得手冷死了,快抽經了,還有三個例子吧,那才是精華,但是三言兩語說不清楚,又不像鬥魚裡面還有人送魚丸,尼瑪,還魚丸咯,魚刺都毛有一根,得了,說說總結吧,我覺得我的總結絕對不是一無是處的!
總結:我覺得用矩陣的想法來解決問題能夠體現比別的快的方面就在於矩陣相乘。當然矩陣解決問題只是一個思想,就跟DP一樣,說不清楚的,面對問題,感覺要用矩陣來解決的話,首先你要摸索怎麼建模,建模的基礎就是“狀態”,從狀態A變更到狀態B這個過程中得出的A與B之間的關係,然後建立矩陣,不知道別人是怎麼解題的,我是今天才接觸的,但是我摸索著來的話我會先建立“起點”和“終點”,然後求中間矩陣K。矩陣的應用很靈活,沒人能完全說清楚,所以我說的也是有錯的,麻煩糾正哈,不要含羞,放下你的矜持來批鬥我,就像對著禽獸喊:“放開那妹子,有事讓我來”一樣!