約瑟夫問題

約瑟夫問題:百度百科

問題:

1,2,3,...,nn 個數圍成一個圈,然後從1 開始隔m 個刪除一個數,(即第一個刪除的數是m )。求問最後一個被刪除的數是多少?

分析:

1,2,3,...,n 第一次刪除以後變成了m+1,m+2,...,n,1,2,...m1 ,對於循環的問題,一般序列1,2,3,...,n0,1,2,...,n 來表示。用數組dp[i][j] 表示一共有i 個數,第j 個刪除的數是dp[i][j]

容易得出性質:

dp[i][j]=1,(dp[i1][j1]+m)%i,i=1other

對於原問題,i==j ,所以第二維沒有任何意義,直接舍掉就好了。

結論:

dp[i]=1,(dp[i1]+m)%i,i=1other

約瑟夫問題變形

問題:

1,2,3,...,nn 個數圍成一個圈,然後從1 開始隔1 個刪除一個數,下一個數每隔2 個刪一個數,隔3 個,…,隔n 個刪一個數,求問最後一個被刪除的數是多少?

分析:

不妨還是用0,1,2,...,n1 代表原序列。第一次刪除後的序列是:1,2,3,...,n1 。如果序列只有n1 個,那麼這個序列是0,1,2,3,...,n2 。可以發現前一個序列刪除後的序列a[i]n1 長度的序列b[i] 滿足a[i]=(b[i]+j)%n ,那麼原來的轉移方程:

dp[i][j]=1,(dp[i1][j1]+m)%i,i=1other

此時發現後面一維出了問題,dp[i1][j1] 不能轉移到dp[i][j] 了。後面的間隔m 也出了問題。
這裏每次刪除的間隔是連續的1,2,3,...,n 所以每次如果第一個間隔改變了,後面的都要變。想到用dp[i][j] 表示有i 個數,一次刪除的間隔爲j,j+1,j+2,...,j+i1

結論:

那麼轉移方程就是:

dp[i][j]=1,(dp[i1][j+1]+j)%i,i=1other
發佈了157 篇原創文章 · 獲贊 13 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章