51nod 1118 机器人走方格 解题思路:动态规划 1119 机器人走方格 V2 解题思路:根据杨辉三角转化问题为组合数和求逆元问题
51nod 1118 機(jī)器人走方格:
思路:這是一道簡單題,很容易就看出用動態(tài)規(guī)劃掃一遍就可以得到結(jié)果,
時間復(fù)雜度O(m*n)。運(yùn)算量1000*1000 = 1000000,很明顯不會超時。
遞推式子:dp[i][j] = dp[i-1][j] + dp[i][j-1]。 dp[i][j]表示當(dāng)規(guī)格為i*j (m = i && n = j) 時本題的結(jié)果。
直接上代碼:
#include <stdio.h> #include <string.h> #define rep(i,o,u) for(int i = o;i <= u; i++) long long a[1002][1002]; int main(){int n,m;scanf("%d%d",&n,&m);memset(a,0,sizeof(a));a[1][1] = 1;rep(i,1,n){rep(j,1,m){a[i][j] = (a[i][j] + a[i-1][j]+a[i][j-1])%1000000007;}}printf("%d\n", a[n][m]);return 0; }51nod 1119 機(jī)器人走方格 V2:
分析:這題和上題的不同之處在于數(shù)據(jù)量變大了。如果還按上題的動態(tài)規(guī)劃。時間復(fù)雜度O(m*n)。
運(yùn)算量將變成10^6*10^6 = 10^12,很明顯會超時。
這時我們需要換一條思路。
一般沒有思路的題我都會去找規(guī)律,如果找不出規(guī)律一般都是需要用到特殊的數(shù)據(jù)結(jié)構(gòu)或者自己能力不夠。
這題也不例外,我開始了找規(guī)律,我發(fā)現(xiàn)1118,也就是上面那個題可以得到這個題的部分?jǐn)?shù)據(jù)。
好吧我們先做個試驗(yàn)把,我修改了一下1118的代碼,輸出了 m = [2,6] & n = [2,6]范圍內(nèi)的數(shù)據(jù)如下:
然后驚訝的發(fā)現(xiàn)這不就是楊輝三角嗎?
想起楊輝三角的定義就是左邊和上面兩個值之和。
我們知道楊輝三角有一個組合數(shù)的性質(zhì)。
然后我們觀察這些數(shù)據(jù)可以發(fā)現(xiàn)dp[i][j] = C(m+n-2,m-1) = C(m+n-2,n-1)。
然后這題就迎刃而解了,轉(zhuǎn)化成了組合數(shù)問題。
可是求組合數(shù)也有一個問題?因?yàn)閿?shù)字過大所以需要取模,我們知道負(fù)數(shù)取模需要用到逆元。
如果不知道逆元,就看一下這個:點(diǎn)擊這里轉(zhuǎn)到博客。
然后就可以上代碼了:
#include <bits\stdc++.h> using namespace std; typedef long long ll; #define Mod 1000000007//求逆元模板 begin ll gcd(ll a,ll b,ll &x,ll &y){if (b==0){x=1,y=0;return a;}ll q=gcd(b,a%b,y,x);y-=a/b*x;return q; } ll ni(ll m,ll n) {ll x = 0,y = 0;gcd(n,m,x,y);if(y > 0) return y;else return n+y; }//求逆元模板 endll C(ll a,ll b){ll num1 = 1,num2 = 1;//求組合數(shù)的分子for(int i = a-b+1;i <= a; i++){num1 = (num1*i)%Mod;}//求組合數(shù)的分母for(int i = 1;i <= b; i++){num2 = (num2*i)%Mod;}//求 (分子num1/分母num2)%Mod 可以轉(zhuǎn)化為 (num1*num2的逆元)%Mod//如果想知道逆元的原理可以看一下我寫的另一篇博客 http://www.cnblogs.com/zhangjiuding/p/7546158.htmlcout << (num1*ni(num2,Mod))%Mod << endl; } int main() {int m,n;cin >> m >> n;C(m+n-2,n-1);return 0; }總結(jié)
以上是生活随笔為你收集整理的51nod 1118 机器人走方格 解题思路:动态规划 1119 机器人走方格 V2 解题思路:根据杨辉三角转化问题为组合数和求逆元问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【模板】求逆元模板
- 下一篇: 【读书笔记】阅读的危险