題目
問題描述
如果乙個序列的奇數項都比前一項大,偶數項都比前一項小,則稱為乙個擺動序列。即 a[2i]a[2i]。
小明想知道,長度為 m,每個數都是 1 到 n 之間的正整數的擺動序列一共有多少個。
輸入格式
輸入一行包含兩個整數 m,n。
輸出格式
輸出乙個整數,表示答案。答案可能很大,請輸出答案除以10000的餘數。
樣例輸入
3 4樣例輸出
樣例說明
以下是符合要求的擺動序列:
2 1 2
2 1 3
2 1 4
3 1 2
3 1 3
3 1 4
3 2 3
3 2 4
4 1 2
4 1 3
4 1 4
4 2 3
4 2 4
4 3 4
評測用例規模與約定
對於 20% 的評測用例,1 <= n, m <= 5;
對於 50% 的評測用例,1 <= n, m <= 10;
對於 80% 的評測用例,1 <= n, m <= 100;
對於所有評測用例,1 <= n, m <= 1000。
這道題當時沒有做出來,後來看了學長的題解才明白!
這道題要用dp,如果用暴力搜尋,可以達到50%的測評用例,混一些分!
我們定義乙個二維dp陣列,在這裡,我們解釋一下dp的含義:(這裡i的奇偶性造成dp[i][j]的含義不同)!
(1)如果是奇數字,那麼dp[i][j]表示第i個數選擇大於等於j的數時的方案總數。
(2)如果是偶數字,那麼dp[i][j]表示第i個數選擇小於等於j的數時的方案總數。
那麼,我們就可以取得狀態轉移方程:
(1)奇數字:dp[i][j]=dp[i-1][j-1]+dp[i][j+1];
(2)偶數字:dp[i][j]=dp[i-1][j+1]+dp[i][j-1];
#include
#include
using
namespace std;
int dp[
1004][
1004];
intmain()
for(
int i =
2; i <= m; i++)}
else}}
int sum = m &
1? dp[m][1
]: dp[m]
[n];
printf
("%d\n"
,sum)
;return0;
}
藍橋杯模擬題 擺動序列
問題描述 如果乙個序列的奇數項都比前一項大,偶數項都比前一項小,則稱為乙個擺動序列。即 a 2i a 2i 小明想知道,長度為 m,每個數都是 1 到 n 之間的正整數的擺動序列一共有多少個。輸入3 4 輸出14 include using namespace std int a 1010 1010...
藍橋杯 擺動序列
題目 問題描述 如果乙個序列滿足下面的性質,我們就將它稱為擺動序列 1.序列中的所有數都是不大於k的正整數 2.序列中至少有兩個數。3.序列中的數兩兩不相等 4.如果第i 1個數比第i 2個數大,則第i個數比第i 2個數小 如果第i 1個數比第i 2個數小,則第i個數比第i 2個數大。比如,當k 3...
藍橋杯 擺動序列 df
include include int a 100 擺動陣列 int vis 100 int k int ans bool judge int x,int index void dfs int count int main 問題描述 如果乙個序列滿足下面的性質,我們就將它稱為擺動序列 1.序列中的所...