藍橋杯模擬賽 擺動序列 題目 題解

2021-10-05 05:44:30 字數 1332 閱讀 4120

題目

問題描述

如果乙個序列的奇數項都比前一項大,偶數項都比前一項小,則稱為乙個擺動序列。即 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.序列中的所...