不來也不去的一隻失憶蝴蝶
阿新 • • 發佈:2019-01-26
題目大意
在一個網格圖中,不能跨越y=x這條直線,只能向右或向上走,問從(0,0)走到(n,n)不經過m個關鍵點中任意一個的方案數,答案模10^9+7。
任意兩點間方案
我們先解決從(i,j)走到(k,l)不跨越y=x,方案是多少。
不跨越y=x,就是不經過y=x+1。
我們知道(i,j)到(k,l)的所有方案為
意思是一共要走k-i+l-j步,其中有k-i步要向上。
再算出非法方案。
可以作(k,l)關於y=x+1的對稱點(l-1,k+1)。
那麼(i,j)到(l-1,k+1)的每一條路徑都可以對應為(i,j)到(k,l)的一條路徑,且這條路徑經過了y=x+1,因此為非法路徑。
非法路徑方案數為 l−1−ik−i+l−j
因此便可算出合法路徑方案。
DP
將(0,0)和(n,n)分別當作第0與第m+1個關鍵點。
排一個序,按照包含關係,也就是x第一關鍵字,y第二關鍵字從小到大。
calc(i,j)表示從第i個關鍵點走到第j個關鍵點不經過y=x+1的方案數。
設f[i]表示從第0個關鍵點走到第i個關鍵點只經過了這兩個關鍵點的方案數。
設g[i]表示從第0個關鍵點走到第i個關鍵點至少經過三個關鍵點的方案數。
顯然f[i]=calc(0,i)-g[i]。
為了不重複,g[i]的轉移也顯然
答案便是f[m+1]。