杨辉三角与组合数
知识点:
组合数与杨辉三角的关系
题目:《上学路线》 中石油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,没有往组合数上去想,看了别人的题解才知道,这就是高中的一道求组合数问题。
蒟蒻一枚,要学的还有很多。
人不一定要生得漂亮,但却一定要活得漂亮。
人生的精彩不在于抽到一手好牌,而在于打好一手烂牌。