1. 程式人生 > 其它 >20211020 航行(未完成)

20211020 航行(未完成)

怎麼也沒想到我會來做期望的題,還想寫題解。。

其實就是把別人的題解用我自己也能看懂的語言抄一遍

Description

一條線有 n 個點,初始速度為 0 ,假設向右為正速度,對於每個點 i ,有 \(\frac{p_i}{100}\) 的機率刮西風,速度加一,反之刮東風,速度減一,如果每次變完速度為 v ,此時從當前點 u 轉移到 u + v ,當座標不在 [1, n] 的時候就立即停止。

求從 [1, n] 的每個點作為起始點,求期望走的次數,走不出去的話輸出 -1 。

Analysis

啊啊啊,看到這種題就很煩,但還是要做呀。。

老思路,想一想一共會有哪些狀態,對於每個點,速度能從 0 到 n ,在大也不可能了,不然速度為 n 的時候早就一下走出去了。

那麼先標記好: \(f_{i, j}\) 表示在第 i 個點,速度為 j 時作為起始狀態,期望走的次數。

Solution

Part1( O(n^6) )

繼續接著老思路走,我們要想對於每個狀態,有哪些其他狀態可以到達。

其實應該很顯然,分成刮西風和刮東風兩種情況。

那麼對於任意一個 \(f_{i, j}\) ,我們就能確定兩個速度,那麼從左右兩邊過來的話,每個速度對應兩個點,一共就能至多從四個狀態轉移過來。

假如走出去了怎麼辦,不管他,但是要標記這個點這個速度能夠走出去,否則根本算不了,這個後面說。

那麼這樣的話我們就得到了 n^2 個關係。

然後就很自然的想到了高消,那麼對於每次從每個點出發,\(f_{i, 0}\)

概率為 1 ,解 n 次方程,總共是 \(O(n^7)\) 的。

前兩天的考試裡面有一道題就出現了類似的情況,要解 n 次方程,但觀察整個高消的過程,如果只是常熟的改變,並不影響高消順序,所以可以把整個 n 組常熟壓到一起解。

所以時間複雜度就是 \(O(n^6)\) 了。

到這裡,其實思路都是很自然的順下來,目前還沒有新思路,那先來補坑,怎麼判 -1 。

想到如果是 -1 ,一定就是指沒有一個能到達的狀態能走出去,又因為概率問題,所以每個狀態必然能到達至少一個至多兩個其他的狀態。

所以這就肯定是圍成了一個環,當然不止著一種情況,如果沒有答案,還有可能是一個環能夠走向一個“死環”(就指沒有出邊的環)。

(心裡話:一開始我在想,為什麼是能夠而不是隻能,後來我發現,每個關係指向的狀態都會對出發狀態產生貢獻。如果貢獻算不了,是 -1 ,那麼這裡的貢獻就缺失了,自然也算不了出發狀態的貢獻了。)

這樣看的話,我們就可以縮點,然後拓撲序排掉 -1 的狀態,剩下的就可以繼續算了。

Part2( O(n^{4.5}) )

雖說速度我們開到了 n ,但是每次走的話,速度至多減一,其實只要最後到邊界的時候,速度為 1 ,就能走出去。

這就相當於對於一個速度,速度每次減一,到邊界的時候速度為一,一共至少走了 n 步就行(注意不是 n 次。。),那麼這個上限能算,就是 \(\sqrt{2n}\)

於是狀態數就減少到 O(n^{1.5}) ,時間複雜度就來到了 O(n^{4.5}) , -1 的情況同上。

Part3( O(n^3) )

其實所有式子合在一起看上去非常“不錯”,因為幾乎全是 0 ,即便是 Part2 無用狀態太多,但又不能去掉,非常的煩。

那麼我們是不是能做到只保留 n 個式子呢??

那要看我們怎麼把一些用處不大但又必須要有的狀態提前合併到一塊了。

最直接的想法就是隻保留 \(f_{i, 0}\) ,那麼這樣的話,本身我們只確定每個狀態與其他狀態的直接貢獻,我們要轉換到確定每個狀態到所有狀態的貢獻,無論是直接的,還是間接的。

形象地理解,就是我們知道一張圖所有邊的樣子,現在我們要變成要知道整張圖的樣子。