1. 程式人生 > >JZOJ.3431【GDOI2014模擬】網格 解題報告

JZOJ.3431【GDOI2014模擬】網格 解題報告

網格

題目描述

某城市的街道呈網格狀,左下角座標為A(0,0),右上角座標為B(n,m),其中n>=m。現在從A(0,0)點出發,只能沿著街道向正右方或者正上方行走,且不能經過圖示中直線左上方的點,即任何途徑的點(x,y)都要滿足x>=y,請問在這些前提下,到達B(n,m)有多少種走法。
這裡寫圖片描述

樣例輸入

6 3

樣例輸出

132

資料範圍

100%的資料中,1 <= m <= n <= 5000

題解

關於這種不能穿過某條直線的網格行走問題,先講一下怎麼做。
我們知道,答案就等於走到點(n,

m)的所有路徑數量減去穿過這條直線的路徑數量。
我們還知道由點(0,0)走到點(n,m)的路徑數為Cn+mn(m)

所以我們現在只需求得穿過這條直線的路徑數量就可以知道答案了。
對於一個如下的網格,有這樣的一條違法路徑穿過了y=x這條直線。

這裡寫圖片描述

易得,不能穿過y=x這條直線就等於不能碰到y=x+1,所以我們找到y=x+1這條直線(圖中為棕色直線),並將原路徑沿這條直線對稱過去(除了最下面的一段,圖中為橙色),可以得到下圖

這裡寫圖片描述

像這樣,路徑中點A(n,m)會對稱到點B(m-1,n+1),並且從原點走到對稱點B(m-1,n+1)的一條路徑都可以對稱回來,並對應著一條從原點走到終點

A(n,m)且穿過y=x直線的路徑。

所以穿過直線y=x的路徑數就對於從原點走到對稱點的路徑數。
走到對稱點B(m-1,n+1)的路徑數SB=Cn+1+m1m1=Cn+mm1
走到原終點A(n,m)的路徑數