国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Codeforces Round #202 (Div. 1) D. Turtles dp

2019-11-08 01:54:41
字體:
來源:轉載
供稿:網友

點擊打開鏈接

題意:給定一張有壞點的網格圖,求左上角走到右下角的兩條不相交路徑的方案數

思路:

考慮如果只有一條路該怎么做顯然 DP 就行了那么我們定義 Calc ( x 1 , y 1 , x 2 , y 2 ) 為從 ( x 1 , y 1 ) 走到 ( x 2 , y 2 ) 的方案數如果不考慮相交,那么答案就是 Calc (2,1, n , m - 1) * Calc (1, 2, n - 1, m )現在考慮相交后,對于一種相交的方案,我們選擇最后一個相交的點,將兩人從這個點往后的目標反轉一下,這樣可以映射到一條從 (2,1) 走到 ( n - 1, m ) 的路徑和一條從 (1, 2) 走到 ( n , m - 1) 的路徑這樣我們就將原先每種不合法的方案和反轉后的每種方案建立起了映射故答案為 Calc (2,1, n , m - 1) * Calc (1, 2, n - 1, m ) - Calc (2,1, n - 1, m ) * Calc (1, 2, n , m - 1)時間復雜度 O ( nm )

代碼:

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int mod = 1000000007;const int maxn = 3e3+10;int n,m;char mp[maxn][maxn];ll dp[maxn][maxn];ll solve(int x,int y, int tx,int ty){	if(mp[x][y] == '#') return 0;	memset(dp,0,sizeof(dp));	dp[x][y] = 1;	for(int i=1; i<=n; i++)		for(int j=1; j<=m; j++){			if(mp[i][j] == '#')				continue;			dp[i][j] += dp[i-1][j]+dp[i][j-1];			dp[i][j] %= mod;		}	return dp[tx][ty];}int main(){	scanf("%d%d",&n,&m);	for(int i=1; i<=n; i++) 		scanf("%s",mp[i]+1);	ll ans = (solve(1,2,n-1,m)*solve(2,1,n,m-1)%mod - solve(1,2,n,m-1)*solve(2,1,n-1,m)%mod + mod) % mod;	cout << ans << endl;}


上一篇:組合公式

下一篇:大整數排序

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 广平县| 毕节市| 永仁县| 娱乐| 宜州市| 淮南市| 富顺县| 长阳| 稷山县| 福州市| 宣城市| 郎溪县| 波密县| 密云县| 通道| 海丰县| 洪泽县| 亚东县| 磐石市| 攀枝花市| 达孜县| 友谊县| 平和县| 乐清市| 乳山市| 峨眉山市| 庄浪县| 麻阳| 德江县| 德州市| 东乌| 洛南县| 建瓯市| 新源县| 策勒县| 潜江市| 钟祥市| 香格里拉县| 石林| 武鸣县| 洛川县|