https://vjudge.net/problem/CodeForces-348D
题意
给一个m*n有障碍的图,求从左上角到右下角两条不相交路径的方案数。
分析
用LGV算法。
从(1,1)-(n,m)的除了终点和起点不能相同的路径选取了(1,2),(2,1) 为起点,(n-1,m),(n,m-1) 为终点,因为从1,1出发只有这两个点可以走,到达(n,m)也只有这两个点,所以与原问题等价。
#include<iostream> #include<string.h> #include<stdio.h> #include<algorithm> #include<math.h> #include<vector> #include<map> using namespace std; typedef long long ll; const int maxn = 3005; const ll mod = 1e9+7; ll dp1[maxn][maxn]; ll dp2[maxn][maxn]; int mp[maxn][maxn]; int n,m; int main() { char s[maxn]; while(~scanf("%d%d",&n,&m)) { memset(dp1,0,sizeof(dp1)); memset(dp2,0,sizeof(dp2)); memset(mp,0,sizeof(mp)); for(int i=1;i<=n;i++) { scanf("%s",s); for(int j=0;j<m;j++) { if(s[j]=='.')mp[i][j+1]=1; } } dp1[1][1]=1; dp2[1][1]=1; for(int i=1;i<=n;i++) for(int j=2;j<=m;j++) if(mp[i][j]) dp1[i][j]=(dp1[i-1][j]+dp1[i][j-1])%mod; for(int i=2;i<=n;i++) for(int j=1;j<=m;j++) if(mp[i][j]) dp2[i][j]=(dp2[i-1][j]+dp2[i][j-1])%mod; printf("%I64d ",((dp1[n-1][m]*dp2[n][m-1])%mod-(dp1[n][m-1]*dp2[n-1][m])%mod+mod)%mod); } }