約瑟夫環 O n 純數學演算法 真牛X

2021-06-16 04:08:19 字數 988 閱讀 4961

這篇文章也是看了別人發的 我分析了一下,想了半天,才弄出點眉目來,其實也沒有想象的那麼難理解,

根據我的理解:應該算是個dp問題,原文中部分內容如下:

變換後就完完全全成為了(n-1)個人報數的子問題,假如我們知道這個子問題的解:例如x是

最終的勝利者,那麼根據上面這個表把這個x變回去不剛好就是n個人情況的解嗎?!!變回

去的公式很簡單,相信大家都可以推出來:x'=(x+k)%n

如何知道(n-1)個人報數的問題的解?對,只要知道(n-2)個人的解就行了。(n-2)個人的解

呢?當然是先求(n-3)的情況 ---- 這顯然就是乙個倒推問題!好了,思路出來了,下面寫

遞推公式:

令f[i]表示i個人玩遊戲報m退出最後勝利者的編號,最後的結果自然是f[n]

遞推公式

f[1]=0;

f[i]=(f[i-1]+m)%i;  (i>1)

有了這個公式,我們要做的就是從1-n順序算出f[i]的數值,最後結果是f[n]。因為實際生

活中編號總是從1開始,我們輸出f[n] + 1

由於是逐級遞推,不需要儲存每個f[i],程式也是異常簡單:

#i nclude

main()

其實這句話最關鍵:

變換後就完完全全成為了(n-1)個人報數的子問題,假如我們知道這個子問題的解:例如x是

最終的勝利者,那麼根據上面這個表把這個x變回去不剛好就是n個人情況的解嗎?!!

根據dp問題,求n個問題的最優解,可以根據n-1個問題的最優解,一直到1個問題,看似是乙個遞迴過程,但是如果用遞迴過程的話,會提高演算法複雜度,這個問題還算比較簡單,容易分析,根據上面博主的推導,採用自底向下分析的方法,先求出2個元素時哪個元素是最優解,然後再將最優解保留,與第三個元素一起算出3個元素時的最優解,所以一直到n-1個元素時,算出的最優解與第n個元素合併算出整個過程的最優解,也就是博主所說的將n-1個元素的最終的勝利者x變回去的說法。

如果有錯誤請各位指出~~~ 我只是分析了一下

約瑟夫環數學解法

無論是用鍊錶實現還是用陣列實現都有乙個共同點 要模擬整個遊戲過程,不僅程式寫起來比較煩,而且時間複雜度高達o nm 當n,m非常大 例如上百萬,上千萬 的時候,幾乎是沒有辦法在短時間內出結果的。我們注意到原問題僅僅是要求出最後的勝利者的序號,而不是要讀者模擬整個過程。因此如果要追求效率,就要打破常規...

約瑟夫環 數學解法

約瑟夫環是乙個數學的應用問題 已知n個人 以編號1,2,3 n分別表示 圍坐在一張圓桌周圍 從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。f 1 0 f i f i 1 m i i 1 includeusin...

約瑟夫環 數學策略

無論是用鍊錶實現還是用陣列實現都有乙個共同點 要模擬整個遊戲過程,不僅程式寫起來比較煩,而且時間複雜度高達o nm 當n,m非常大 例如上百萬,上千萬 的時候,幾乎是沒有辦法在短時間內出結果的。我們注意到原問題僅僅是要求出最後的勝利者的序號,而不是要讀者模擬整個過程。因此如果要追求效率,就要打破常規...