Codeforces Round #202 (Div. 1) D. Turtles
来源:互联网 发布:2015年进出口数据 编辑:程序博客网 时间:2024/05/11 17:14
深受数学竞赛影响,一开始在想折线计数方法,想用容斥原理来搞定有不能取的点的情况,事实说明我是个傻吊。。。3000*3000,有可能全是不能取的点,这么多点用个毛线容斥。。。刷题少了!!!!肯定DP啊,而且方程是十分简单,但是题目中有个限制是两条路径不能相交,这就需要大神的指引了!题解给出的是rng_58给的高贵冷艳的Lindström–Gessel–Viennot 引理,见链接:http://en.wikipedia.org/wiki/Lindstr%C3%B6m%E2%80%93Gessel%E2%80%93Viennot_lemma。
表示没大看懂,更不要说证明了,但是会用就行,直接把结论拿过来,两个点集,A, B, 从A中一个点到B的所有路径中不相交的路径对数等于以下这个矩阵的行列式:
.
其中e(a, b)表示a 到 b的路径条数。所以答案是
我们取初始集合为A((0, 1), (1, 0)) B((n - 1), m - 2) (n - 2, m - 1)即可。
代码:
dp部分写成函数会减少代码量。
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define N 3005#define Mod 1000000007 using namespace std;long long dp[2][N][N], m, n;char s[N][N];void go (int k, int x, int y){int i, j;if (s[x][y] == '.') dp[k][x][y] = 1;for (i = x; i < n; ++i)for (j = y; j < m; ++j){if (s[i][j] == '.' && (i != x || j != y))dp[k][i][j] = ((i >= 1 ? dp[k][i - 1][j] : 0) + (j >= 1 ? dp[k][i][j - 1] : 0)) % Mod;}} int main(){int i, j, k;long long re;cin >> n >> m;for (i = 0; i < n; ++i) scanf("%s", s[i]);go(0, 0, 1), go(1, 1, 0);re = abs(dp[1][n -1][m - 2] * dp[0][n - 2][m - 1] % Mod - dp[1][n - 2][m - 1] * dp[0][n - 1][m - 2] % Mod + Mod) % Mod;printf("%I64d\n", re);return 0; }
- Codeforces Round #202 (Div. 1) D. Turtles
- Codeforces Round #202 (Div. 1) D. Turtles dp
- Codeforces Round #253 (Div. 1)D题
- Codeforces Round #225 (Div. 1) D. Antimatter
- Codeforces Round #276 (Div. 1) D. Kindergarten
- Codeforces Round #286 (Div. 1) C、D
- Codeforces Round #434 Div.1 D graph
- Codeforces Round #250 (Div. 2) && (Div. 1) D题
- Codeforces Round #400 (Div. 1 + Div. 2, combined)D
- Codeforces Round #400 (Div. 1 + Div. 2, combined)D
- Codeforces Round #237 (Div. 2) D. Minesweeper 1D
- Codeforces Round #237 (Div. 2) D Minesweeper 1D
- Codeforces Round #237 (Div. 2)-D. Minesweeper 1D
- Codeforces Round #237 (Div. 2) D. Minesweeper 1D
- 【Codeforces Round #200 (Div. 1)】Codeforces 343D Water Tree
- 【Codeforces Round #122 (Div. 1)】Codeforces 193D Two Segments
- 【Codeforces Round #196 (Div. 1)】Codeforces 338D GCD Table
- 【Codeforces Round #411 (Div. 1)】Codeforces 804D
- C# Excel 行高,列宽,合并单元格,单元格边框线,冻结(转载)
- linux mysql修改my.cnf的innodb_log_file_size ,提示:Unknown/unsupported storage engine: InnoDB
- 旧硬盘换新主板,怎么做才不需要重装系统?
- 线性代数导论9——线性相关性、基、维数
- 坠落凡间的struts2(9)---struts2和struts1区分
- Codeforces Round #202 (Div. 1) D. Turtles
- Android入门学习(一)——准备
- linux组成和linux系统目录详解
- mysql在表的某一位置增加一列、删除一列、修改列名
- hdu 1013-Digital Roots
- 【每天一个Linux命令】22. 删除文件命令rm && 删除空目录命令rmdir
- 打造轻量级Windows Phone7 游戏引擎-Samurai 第一话 Globals & Music
- poj1062
- 闪回数据库(Flashback Database)