動態規劃專題:傳球遊戲

題目描述:

上體育課的時候,小蠻的老師經常帶着同學們一起做遊戲。這次,老師帶着同學們一起做傳球遊戲。 
遊戲規則是這樣的:n個同學站成一個圓圈,其中的一個同學手裏拿着一個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的一個(左右任意),當老師再次吹哨子時,傳球停止,此時,拿着球沒傳出去的那個同學就是敗者,要給大家表演一個節目。 
聰明的小蠻提出一個有趣的問題:有多少種不同的傳球方法可以使得從小蠻手裏開始傳的球,傳了m次以後,又回到小蠻手裏。兩種傳球的方法被視作不同的方法,當且僅當這兩種方法中,接到球的同學按接球順序組成的序列是不同的。比如有3個同學1號、2號、3號,並假設小蠻爲1號,球傳了3次回到小蠻手裏的方式有1->2->3->1和1->3->2->1,共2種。 

大致思路:

傳球到自己手中只有兩種可能性,就是從第i+1人手中或i-1手中傳到自己手中,得到狀態轉移方程:f[i][j] = f[i-1][j-1]+f[i+1][j-1]。

代碼:

#include <iostream>
#include <cstring>


using namespace std;


int n,m,ans[35][35];


int main() {
    cin>>n>>m;
    memset(ans,0,sizeof(ans));
    ans[1][0] = 1;
    for (int i = 1; i<=m; i++) {
        ans[1][i] = ans[2][i-1]+ans[n][i-1];
        ans[n][i] = ans[n-1][i-1]+ans[1][i-1];
        for (int j = 2; j<n; j++)
            ans[j][i] = ans[j-1][i-1]+ans[j+1][i-1];
    }
    cout<<ans[1][m]<<endl;
}


發佈了90 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章