日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

51nod 1118 机器人走方格 解题思路:动态规划 1119 机器人走方格 V2 解题思路:根据杨辉三角转化问题为组合数和求逆元问题

發(fā)布時間:2024/4/19 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 51nod 1118 机器人走方格 解题思路:动态规划 1119 机器人走方格 V2 解题思路:根据杨辉三角转化问题为组合数和求逆元问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。