一:传送门
M * N的方格,左上走到右下,
只能向右或向下走。有多少种不同的走法?
由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果。
Input
第1行,2个数M,N,中间用空格隔开。(2 <= m,n <= 1000)
Input
2 3
Output
3
分析:
n, m 都非常小,可以直接打表递推出来。因为只能 向右走 或 向下走,
a[ i ] [ j ] = a[ i - 1 ][ j ] + a[ i ][ j-1 ]; 当前格的方案数 = 上面格的方案数 + 左面格的方案数。
void DP(int m, int n)
{
for(int i = 1; i <= m; i++)
dp[i][1] = 1;
for(int i = 1; i <= n; i++)
dp[1][i] = 1;
for(int i = 2; i <= m; i++)
for(int j = 2; j <= n; j++)
dp[i][j] = (dp[i-1][j] + dp[i][j-1])%M;
}
二:传送门
问题同上,只是 m , n 的数据范围都扩大到了 1e6 ~~~
分析:
显然,用递推,打表,时间过不去,内存也存不下。
对于这个表,观察后可以发现,如果顺时针旋转45°,就是一个杨辉三角形~~(行和列都从 0 开始计数)
对于一个杨辉三角
行数n 和 每行的个数m 都从0开始计数<