原題鏈結
題目描述
上體育課的時候,小蠻的老師經常帶著同學們一起做遊戲。這次,老師帶著同學們一起做傳球遊戲。遊戲規則是這樣的:n個同學站成乙個圓圈,其中的乙個同學手裡拿著乙個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的乙個(左右任意),當老師再次吹哨子時,傳球停止,此時,拿著球沒有傳出去的那個同學就是敗者,要給大家表演乙個節目。聰明的小蠻提出乙個有趣的問題:有多少種不同的傳球方法可以使得從小蠻手裡開始傳的球,傳了m次以後,又回到小蠻手裡。兩種傳球方法被視作不同的方法,當且僅當這兩種方法中,接到球的同學按接球順序組成的序列是不同的。比如有三個同學1號、2號、3號,並假設小蠻為1號,球傳了3次回到小蠻手裡的方式有1->2->3->1和1->3->2->1,共2種。輸入格式
一行,有兩個用空格隔開的整數n,m(3 ≤ n ≤ 30,1 ≤ m ≤ 30)。輸出格式
1個整數,表示符合題意的方法數。輸入樣例
3 3輸出樣例 分析:①定義動態規劃求解物件:dp[i][j]表示走了 j 步到達位置 i
②狀態轉移方程:分析題意得,想要走到在 j 步位置 i ,有兩種情況:
(1)在第j - 1步走到位置 i 的左邊;
(2)在第j - 1步走到位置 i 的右邊;
由此得出狀態轉移方程dp[i][j] = dp[left(i)][j - 1] + dp[right(i)][j - 1]
③邊界條件:在下圖中,畫出了乙個二維陣列dp,陣列的列數表示當前傳球的次數,行數表示球在當前哪個位置。如在傳第0次球(還沒開始傳球)時,只有第乙個位置(第一行)有球,故dp[1][0] = 1
繼續分析,以傳3次球傳到位置2為例,傳3次球的方案數一定與傳2次球的方案數有關且可以從位置1傳到位置2,也可以從位置3傳到位置2。位置2的左邊是位置1,右邊是位置3,動態轉移方程為dp[2][3] = dp[1][2] + dp[3][2],
如圖所示:
在到達上圖的狀態時,可以推出第2列的數值了,如下圖:
之後在遞推第三列時,先將第二列的第0行和第n + 1行補齊,如下圖… …以此類推得出結果。
//位置1傳了m次
return0;
}去掉一些換行和標頭檔案,會發現ac**就20行…突然感覺演算法太強了啊…
#include
#include
using
namespace std;
const
int n =35;
int dp[n]
[n];
intmain()
cout << dp[1]
[m]<< endl;
return0;
}
NOIP2008普及組題解
noip2008普及組題解 從我在其他站的部落格直接搬過來的 posted 2016 04 16 01 11 t1 isbn號碼 每一本正式出版的圖書都有乙個isbn號碼與之對應,isbn碼包括9位數字 1位識別碼和3位分隔符,其規定格式如 x xx x 其中符號 就是分隔符 鍵盤上的減號 最後一位...
計蒜客NOIP2008 動態規劃
上體育課的時候,小蠻的老師經常帶著同學們一起做遊戲。這次,老師帶著同學們一起做傳球遊戲。遊戲規則是這樣的 n 個同學站成乙個圓圈,其中的乙個同學手裡拿著乙個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的乙個 左右任意 當老師再次吹哨子時,傳球停止,此時,拿著球沒傳出去的那個同...
動態規劃入門 NOIP2008 傳紙條
小淵和小軒是好朋友也是同班同學,他們在一起總有談不完的話題。一次素質拓展活動中,班上同學安排做成乙個m行n列的矩陣,而小淵和小軒被安排在矩陣對角線的兩端,因此,他們就無法直接交談了。幸運的是,他們可以通過傳紙條來進行交流。紙條要經由許多同學傳到對方手裡,小淵坐在矩陣的左上角,座標 1,1 小軒坐在矩...