給乙個\(n \times m\)的01網格,1不能走,從起點\((1, 1)\)走到\((n, m)\),每次只能向下或向右走一格,問兩條不相交的路徑的方案數。(n, m<=1000)
先考慮一條,再考慮去掉相交的情況。
令\(d(a, b, c, d)\)表示從\((a, b)\)走到\((c, d)\)一條路徑的方案數,則可以簡單得到答案:
\[ans = d(2, 1, n, m-1) + d(1, 2, n-1, m) - t\]
我們來考慮任意兩條相交路徑。
令\(p\)表示這些交點最下最右的點。那麼我們將後面那一段路徑換一下,也就是原來我往下,現在我往右,原來往右,現在往下。
發現其實這就是\(d(2, 1, n-1, m) + d(1, 2, n, m-1)\)
於是我們減掉後者即可。
#include using namespace std;
const int mo=1e9+7;
int n, m;
char s[2005][2005];
int d[2][2005][2005];
int main()
d[0][1][1]=d[1][1][1]=1;
for(int i=1; i<=n; ++i)
}if(i!=1) }}
}}
printf("%lld\n", (1ll*d[0][n][m-1]*d[1][n-1][m]%mo-1ll*d[0][n-1][m]*d[1][n][m-1]%mo+mo)%mo);
return 0;
}
弱省互測 0 t3
要求給出下面 的答案然後構造輸入。給乙個圖,n 個點 m 條邊 q 次詢問,輸出所有點對之間最大權值最小的路徑。把每乙個詢問的輸出看成一條邊,建一棵最小生成樹。給輸出,要求構造輸入使得用所給 執行後得到的輸出和給出的輸出相同。所給 n 次 dijkstra 求兩點間最短路 考慮一下貪心。首先還是把每...
弱省互測 0 t2
給定兩個字串 a 和 b,求下面四個問題的答案 1.在 a 的子串中,不是 b 的子串的字串的數量。2.在 a 的子串中,不是 b 的子串行的字串的數量。3.在 a 的子串行中,不是 b 的子串的字串的數量。4.在 a 的子串行中,不是 b 的子串行的字串的數量。其中子串是指本質不同的子串,不同的位...
弱省互測 2 t3
給出 n 個01位元組和 m 個01位元組,要求用後者去匹配前者,兩個串能匹配當且僅當除了每個位元組末位不同,其他位都要相同。問匹配後者至少有多少個末位不同。1 le m le n le 2.5 times 10 5 首先我們可以用kmp計算出能匹配的位置,然後單獨考慮末位不同的情況。我們將末尾的位...