有一個長度爲n的排列a,其中有一些位置被替換成了−1。你須要嘗試恢 復這個排列,將−1替換回數字。 求有多少種可行的替換方法,知足獲得的是一個排列,且不存在ai = i的 位置。n ≤ 2000。spa
對於一個排列,能夠用一個n*n的方陣來表示,第i行第j列若是被標記,則表明數字 i填在了第j個位置(aj = i)方法
對於給定的排列,不爲−1的位置已經被 標記在棋盤上,而棋盤的主對角線上(ai = i)不能夠被標記數字
從棋盤中刪去不爲−1的位置的列,以及已經出現了的數字的行,記此時棋盤大小爲N
不難發現,每列不可被標記的位置至多隻有1個,每行也是一樣,記這種位置的數量爲M
令f[N,M]表示,在這樣的棋盤上標記N個格子的方案數
轉移方程爲:f[n,m] = f[n,m − 1] − f[n − 1,m − 1] 邊界爲f[i,0] = i!
轉移方程的含義爲,相比起f[n,m − 1]的狀態,f[n,m]的狀態要多一個不 可標記的位置,而標記了這個位置的方案數爲f[n − 1,m − 1](有一行一列已經被佔用),所以從中減去。