ccsu 1179 青蛙過河 遞推

題目:

有一條河,左邊一個石墩(A區)上有編號爲1,2,3,4,…,n的n只青蛙,河中有k個荷葉(C區),還有h個石墩(D區),右邊有一個石墩(B區),如下圖2—5所示。 


n只青蛙要過河(從左岸石墩A到右岸石墩B),規則爲: 
1)石墩上可以承受任意多隻青蛙,荷葉只能承受一隻青蛙(不論大小); 
(2)青蛙可以:A→B(表示可以從A跳到B,下同),A→C,A→D,C→B,D→B,D→C,C→D; 
(3)當一個石墩上有多隻青蛙時,則上面的青蛙只能跳到比它大1號的青蛙上面。 
你的任務是對於給出的h,k,計算並輸出最多能有多少隻青蛙可以根據以上規則順利過河? 


思路:

若河中沒有石墩,則最多隻能有m(荷葉數)+1 的青蛙按規則跳到B上,(前m只先呆在荷葉上,1只跳上B,然後……)。

河中有石墩,則將每個石墩看做B,則第一個石墩先可有m+1只青蛙,第二個石墩可有比之前都大的m+1只,然後可將第一個石墩上的青蛙通過荷葉移到第二個石墩上…… 由此可見到達B上的青蛙數等於可以停留在河中的青蛙數。

我們用f[m][n]表示有m個荷葉和n個石柱時,最多有多少隻青蛙能夠過河。實際上石柱和岸是差不多的,比如如果我們分析有多少隻青蛙可以落腳在第n個石柱上,那麼顯然這是等於f[m][n-1]的,因爲只能藉助其它n-1根石柱和m個荷葉來達成目的。
    於是我們就得到了這樣的結論,f[m][n]=f[m][n-1](第n個石柱上的青蛙)+f[m][n-1](剩下的地方所有的可以過到對岸的青蛙)。當然,第n個石柱上的青蛙既然能到達第n個石柱,自然也可以到達右岸,因爲對青蛙的操作都是可逆的(逆回去時把原本的A變成D即可)。
    根據上面的公式,我們自然可以得到f[m][n]=f[m][0]*2^n,f[m][0]表示沒有石柱時一共可以過到對岸的青蛙,自然就是m+1,這樣就得到了最後的結果(m+1)*2^n

代碼直接帶公式:

#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
         m=m+1;
         printf("%.0lf\n",m*pow(2.0,n));
    }
    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章