1. 程式人生 > >不來也不去的一隻失憶蝴蝶

不來也不去的一隻失憶蝴蝶

題目大意

在一個網格圖中,不能跨越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)的所有方案為Ckiki+lj
意思是一共要走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,因此為非法路徑。
非法路徑方案數為C

l1iki+lj
因此便可算出合法路徑方案。

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]的轉移也顯然
g[i]=i1j=1f[j]calc(j,i)
答案便是f[m+1]。