幾道排列組合題的總結

來源:HDU遞推求解專題練習(For Beginner)php

2045: 令f(n)爲n個方格的塗色方案數,易得f(1)=3,f(2)=6,f(3)=6。現考慮f(n+1)的狀況,f(n+1)其實是在n方格的塗法中再追加一格得出的,n方格的塗法能夠分爲兩類:
 
1) 合法的(即計入f(n)中的塗法),在此狀況下,因爲第1格與第n格不一樣,而第n+1格必須與第1格、第n格都不一樣,所以對於每種肯定的n格塗法,第n+1格只有一個選擇,所以該狀況下的n+1格塗法數爲f(n)
2) 前n-1格合法(計入f(n-1)),第n格與第1格同色,此狀況下,只要在第n+1格塗上與第1格不一樣的顏色(也必與第n格不一樣)便可構造合法的n+1格塗法。證實以下:前n-1格爲合法塗法=>第n-1格與第1格顏色不一樣,第n格與第1格顏色相同=>第n格與第n-1格顏色不一樣,第n+1格與第n格顏色不一樣=>第n+1格與第1格顏色不一樣=>此塗法合法。這種狀況一共有f(n-1)種(在每種前n-1格合法塗法後加一個和第1格顏色相同的格子便可構造出來),對於每種該狀況下的塗法,第n+1格都有2種顏色能夠選擇,所以該狀況下的n+1格塗法數爲2*f(n-1)
綜合1)2),可得遞推公式f(n+1)=f(n)+2f(n-1) (n>3)
 
2047: 記N(n)爲長度爲n的、非O結尾的合法EOF串的數目,O(n)爲長度爲n的,以O結尾的合法EOF串的數目。顯然有N(1)=2, O(1)=1. 對於N(n+1),可在N(n)及O(n)後添加E或F獲得,所以有遞推式N(n+1)=N(n)+O(n)。對於O(n+1),可在N(n)後添加O獲得,所以有遞推式O(n+1)=N(n),O(n+1)+N(n+1)即爲長度爲n+1的合法EOF串的總數。

2048: 令D(n,n)爲n人都拿到別人字條的狀況數,則可知D(n,n)/A(n,n)爲此狀況出現的機率。首先有D(2,2)=1(即[2,1]), D(3,3)=2([2,3,1]和[3,1,2])。觀察D(4,4)的全部9種狀況([2,1,4,3],[3,1,4,2],[4,1,2,3],[2,4,1,3],[3,4,1,2],[4,3,1,2],[2,3,4,1],[4,3,2,1],[3,4,2,1]),能夠將這9種狀況分爲兩組:
 
1) 在D(3,3)的全部狀況後加入4,而後將4與前面的元素逐一調換,得出的每一種狀況都不重複且屬於D(4,4):[2,3,1,4]=>[4,3,1,2],[2,4,1,3],[2,3,4,1]; [3,1,2,4]=>[4,1,2,3],[3,4,2,1],[3,1,4,2]。該狀況的數量爲D(3,3)*3;推廣開來,對於D(n+1,n+1),狀況數爲D(n,n)*n;
2) 對於全部的D(3,2)狀況(3人中2人拿到別人字條,1人拿到本身字條),即[1,3,2],[3,2,1],[2,1,3]添加4後,將4與拿到本身字條的人交換位置,也能夠生成合法狀況:[1,3,2,4]=>[4,3,2,1]; [3,2,1,4]=>[3,4,1,2]; [2,1,3,4]=>[2,1,4,3]。接下來再考慮D(3,2)的計算,它實際上能夠看做是在D(2,2)上直接添加一我的獲得,此時3人分爲AB兩組:A組2人都沒有拿到本身的字條,B組1人拿到本身字條。A組的構成方法有C(3,2)種(也能夠構成B組C(3,1),這是等價的,由於C(m,n)=C(m,m-n))。A組的組內狀況有D(2,2)種,所以一共有C(3,1)*D(2,2)=D(2,2)*3種,推廣開來,對於D(n+1,n+1),狀況數爲D(n-1,n-1)*n
將狀況1)和2)相加可得遞推公式D(n+1,n+1)=(D(n,n)+D(n-1,n-1))*n,其中初始狀態D(2,2)=1,D(3,3)=2. 數值較大,建議使用unsigned long long

2049: 令D(m,n)爲m對中n對配對錯誤的狀況數,首先根據2048中的解法可求得全部D(m,m) (m in (1,20])的值,如今的問題變爲如何求D(m,n) (m>n)。首先將m人分爲AB兩組:A組爲n對配對錯誤的,B組爲m-n對配對正確的。AB兩組的分組方案有C(m,n)種,而對於A組,組內狀況有D(n,n)種,對於B組,組內狀況數爲1,所以D(m,n)=D(n,n)*C(m,n)
 
OJ刷題真心挺好玩的,可謂寓教於樂的算法學習方法…
相關文章
相關標籤/搜索