组合数的递归调用:poj 1942 Paths on a Grid

题目大意:

一个矩形网格grid(n*m),从左下角走到右上角,问所有可能的路径数目。


解题思路:

以3×4的网格为例,问题等价于从_ _ _ _ _ _ _选出4个空格为“→”,剩下3个空格为“↑”,例如:

→ → → → ↑ ↑ 

    

… … … …

!!!组合数C(n+m,m)

为了减少计算,这里m取min{n,m}


  • C(n,m)=A(n,m)/A(m,m)=n! / (n-m)!×m!

关于组合数C(n,m)的代码实现,这里提供两种方法:


(1)递归调用



(2)迭代(自己复合自己,重叠一定的步骤,新的值替代旧的值,累加、累乘都属于迭代过程)



参考代码+部分解释:

递归调用

#include 
   
   
    
    
#include 
    
    
     
     
#include 
     
     
      
      
#include 
      
      
#include 
       
       
         #include 
        
          #include 
         
           using namespace std; typedef long long ll; const int maxn = 7e4+10; ll n,m; ll com(ll n,ll m)//返回C(n,m) { return m==0?1:com(n-1,m-1)*n/m; } int main() { // freopen("input.txt","r",stdin); while(cin>>n>>m&&(n||m)){ ll a=n+m,b=min(n,m); cout< 
          
            < 
            
           
          
         
       
     
     
    
    
   
   

==========================华丽的分割线=============================

迭代

#include 
    
    
     
     
#include 
     
     
      
      
#include 
      
      
       
       
#include 
       
       
#include 
        
        
          #include 
         
           #include 
          
            using namespace std; typedef long long ll; const int maxn = 7e4+10; ll n,m; ll solve(ll n,ll m)//返回C(n,m) { ll ans=1; for(ll i=n,j=1;j<=m;i--,j++)//C(n,m)=A(n,m)/A(m,m); ans=ans*i/j; //不要写成ans*=i/j,这样就先运算i/j了 return ans; } int main() { // freopen("input.txt","r",stdin); while(cin>>n>>m&&(n||m)){ ll a=n+m,b=min(n,m); cout< 
           
             < 
             
            
           
          
        
      
      
     
     
    
    



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值