知识点:
组合数与杨辉三角的关系
题目:《上学路线》 中石油oj
题目描述
小D从家到学校的道路结构是这样的:由n条东西走向和m条南北走向的道路构成了一个n*m的网格,每条道路都是单向通行的(只能从北向南,从西向东走)。
已知小D的家在网格的左上角,学校在网格的右下角。
问小D从他的家到学校一共有多少种不同的上学路线。
已知小D的家在网格的左上角,学校在网格的右下角。
问小D从他的家到学校一共有多少种不同的上学路线。
输入
两个正整数n和m,意义如题目所述。
输出
小D上学路线数量,结果队1000000007取余。
样例输入
3 4
样例输出
10
提示
100%的数据,n,m≤1000
思路详解:
从(1,1)走到(n,m)需要向下走(记为D)n-1次,向右走(记为R)m-1次,总共走m+n-2次;这就转化为了长度为n+m-2的序列,含有n-1个D,m-1个R的组合方式有多少种?即求Cn+m-2n-1的值mod1000000007的值;
杨辉三角求组合数代码如下:
1 #include<cstring>
2 #include<iostream>
3 #include<algorithm>
4 #include<stdio.h>
5 #include<cmath>
6 #include<queue>
7 #include<set>
8 #include<iostream>
9 #include <time.h>
10 using namespace std;
11 typedef long long ll;
12 ll a[2005][2005];
13 int main(){
14 int n,m;cin>>n>>m;
15 for(int i=0;i<=n+m-2;i++){
16 a[i][0]=a[i][i]=1;
17 }
18 for(int i=2;i<=n+m-2;i++){
19 for(int j=1;j<i;j++){
20 a[i][j]=(a[i-1][j-1]+a[i-1][j])%1000000007;
21 }
22 }
23 cout<<a[n+m-2][n-1]<<endl;;
24 return 0;
25 }
除了可以用组合数来求,也可以使用dp列举所有情况;
递推公式为:dp[ i ][ j ]=dp[ i-1 ][ j ]+dp[ i ][ j-1 ];
dp代码如下:
1 #include<cstring>
2 #include<iostream>
3 #include<algorithm>
4 #include<stdio.h>
5 #include<cmath>
6 #include<queue>
7 #include<set>
8 #include<iostream>
9 #include <time.h>
10 using namespace std;
11 typedef long long ll;
12 ll dp[1005][1005];
13 int main(){
14 int n,m;cin>>n>>m;
15 for(int i=1;i<=m;i++){
16 dp[1][i]=1;
17 }
18 for(int i=1;i<=n;i++)
19 dp[i][1]=1;
20 for(int i=2;i<=n;i++){
21 for(int j=2;j<=m;j++){
22 dp[i][j]=(dp[i-1][j]+dp[i][j-1])%1000000007;
23 }
24 }
25 cout<<dp[n][m]<<endl;
26 return 0;
27 }
总结:做这道题时只想到了dp,没有往组合数上去想,看了别人的题解才知道,这就是高中的一道求组合数问题。
蒟蒻一枚,要学的还有很多。