[51nod1119]机器人走方格V2

解题关键:

1、此题用dp的方法可以看出,dp矩阵为杨辉三角,通过总结,可以得出 答案的解为$C_{n + m - 2}^{n - 1}$

2、此题可用组合数学的思想考虑,总的步数一共有$n+m-2$步,在这所有的步数中,需要选择向下走的步数的位置,由此可得,答案的解为:$C_{n + m - 2}^{n - 1}$

此题即可转化为大组合数取模问题;

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int mod=1e9+7;
 5 ll mod_pow(ll x,ll n,ll p){
 6     ll res=1;
 7     while(n){
 8         if(n&1) res=res*x%p;
 9         x=x*x%p;
10         n>>=1;
11     }
12     return res;
13 }
14 ll comb(ll n,ll m,ll p){
15     if(n==m) return 1;
16     if(n<m) return 0;
17     if(m>n-m) m=n-m;
18     
19     ll tn=1,tm=1;
20     while(m){
21         tn=tn*n%p;
22         tm=tm*m%p;
23         n--,m--;
24     }
25     return (tn*mod_pow(tm,p-2,p)+mod)%mod;
26 }
27 int main(){
28     int n,m;
29     cin>>n>>m;
30     ll ans=comb(n+m-2,n-1,mod);
31     cout<<ans<<endl;
32     return 0;
33 }

如下为dp的解法

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int mod=1e9+7;
 5 int dp[1002][1002];
 6 int main(){
 7     int n,m;
 8     cin>>n>>m;
 9     for(int i=0;i<=1000;i++){
10         dp[1][i]=dp[i][1]=1;
11     }
12     for(int i=2;i<=m;i++){
13         for(int j=2;j<=n;j++){
14              dp[i][j]=(dp[i-1][j]+dp[i][j-1])%mod;
15         }
16     }
17     cout<<dp[m][n]<<endl;
18 }

 

posted @ 2017-05-28 02:56  Elpsywk  阅读(204)  评论(0编辑  收藏  举报