组合数C(n,m)=C(n-1,m)+C(n-1,m-1) 即对于第n个,不选和选
组合数代码实现:(n>20时)
(方法2的证明,拍的歪了emmm)
//方法1:O(n^2)
int ans[maxn][maxn];
int n=5,m=3;
for(int i=1;i<=5;i++)
ans[i][i]=ans[i][0]=1;//i个里面选i个和i个里面选0个
for(int i=2;i<=n;i++)
for(int j=1;j<=i/2;j++)
{
ans[i][j]=ans[i-1][j]+ans[i-1][j-1];
ans[i][i-j]=ans[i][j];//避免再重复计算,直接赋值
}
cout<<ans[5][3]<<endl;
//方法2:O(m)
long long res=1;
for(int i=1;i<=m;i++)
res=res*(n-m+i)/i;
cout<<res<<endl;
//两个输出结果都是10
-
n*m大小的棋盘,每次都只能向下或者向右走一步,求从左上角到右下角共有多少条路
dp方法: dp[i][j]=dp[i