問題:
1,2,3,...,n 這n 個數圍成一個圈,然後從1 開始隔m 個刪除一個數,(即第一個刪除的數是m )。求問最後一個被刪除的數是多少?
分析:
1,2,3,...,n 第一次刪除以後變成了m+1,m+2,...,n,1,2,...m−1 ,對於循環的問題,一般序列1,2,3,...,n 用0,1,2,...,n 來表示。用數組dp[i][j] 表示一共有i 個數,第j 個刪除的數是dp[i][j] 。
容易得出性質:
dp[i][j]=⎧⎩⎨1,(dp[i−1][j−1]+m)%i,i=1other
對於原問題,i==j ,所以第二維沒有任何意義,直接舍掉就好了。
結論:
dp[i]=⎧⎩⎨1,(dp[i−1]+m)%i,i=1other
約瑟夫問題變形
問題:
1,2,3,...,n 這n 個數圍成一個圈,然後從1 開始隔1 個刪除一個數,下一個數每隔2 個刪一個數,隔3 個,…,隔n 個刪一個數,求問最後一個被刪除的數是多少?
分析:
不妨還是用0,1,2,...,n−1 代表原序列。第一次刪除後的序列是:1,2,3,...,n−1 。如果序列只有n−1 個,那麼這個序列是0,1,2,3,...,n−2 。可以發現前一個序列刪除後的序列a[i] 和n−1 長度的序列b[i] 滿足a[i]=(b[i]+j)%n ,那麼原來的轉移方程:
dp[i][j]=⎧⎩⎨1,(dp[i−1][j−1]+m)%i,i=1other
此時發現後面一維出了問題,
dp[i−1][j−1] 不能轉移到
dp[i][j] 了。後面的間隔
m 也出了問題。
這裏每次刪除的間隔是連續的
1,2,3,...,n 所以每次如果第一個間隔改變了,後面的都要變。想到用
dp[i][j] 表示有
i 個數,一次刪除的間隔爲
j,j+1,j+2,...,j+i−1 。
結論:
那麼轉移方程就是:
dp[i][j]=⎧⎩⎨1,(dp[i−1][j+1]+j)%i,i=1other