1. 程式人生 > >有n個帶編號的人和n個帶編號的座位,求每個人都不坐在相同號碼座位的方案數目

有n個帶編號的人和n個帶編號的座位,求每個人都不坐在相同號碼座位的方案數目

題目描述:

    有 n 位同學編號分別為1, 2, ..., n; 有 n 個座位編號分別為1, 2, ..., n。

    現在為每一位同學安排一個座位,求每個同學都坐在與自己編號不同的座位的方案數目。

分析:動態規劃思想:

    假設 i 位同學,i 個座位,滿足題意的方案數為 f(i)。

    考察分別有 (i-1) 和 i 位同學的情況。

    為了形象化地進行思考,設 i = 4。原來 i = 3 的時候,有 f(3) 種滿足題意的方案。現在加入 i=4,則前面 1,2,... (i-1) 即 1,2,3 都可以坐在編號=4 的座位上,所以有 (i-1) 種可能。  

    假設現在是 1 坐在 4 號座位上,即:

          座位:1   2   3   4

          學生:?   ?   ?   1

    現在考察 4 號學生應該坐在哪裡呢?

    (1) 4 號學生 坐在 1 號座位上,即:

          座位:1   2   3   4

          學生:4   ?   ?   1

     那麼,我們可以非常明顯地看到,可以把 1號座位和4 號座位拿開,讓 2號同學和3號同學選 2號座位和 3號座位,即 f(i-2) ( f(2) )

(2)4 號學生 不能坐 1號座位上,那麼此時:

         待安排的學生: 2 號,3 號,4 號

         待安排的座位: 1 號,2 號,3 號

          約束條件: 2 號學生   不能坐   2 號座位; (題目明確的要求!)

                             3 號學生   不能坐   3 號座位;

                             4 號學生   不能坐   1 號座位

         好!這個題目最有意思的就是這種情況,我們可以抽象地將 4號學生和 1號座位 想象成相匹配的 x 號學生和 x 號座位,那麼:

          待安排的學生為 x 號,2號,3號;

          待安排的座位為 x 號,2號,3號;

          顯然,滿足題意的方案數 = f(i-1)  ( f(3) )

綜上所述, f(i) = (i-1) * ( f(i-1) + f(i-2) )

這道題比較難理解的就是: 當 4 號學生 不能坐 1號座位上,需要抽象地將此問題轉化為 規模為 (i-1) 的原問題。