擺動序列 DFS DP

2021-10-02 18:59:53 字數 1418 閱讀 8187

問題 1630: [藍橋杯][演算法訓練vip]擺動序列

時間限制: 1sec 記憶體限制: 128mb 提交: 72 解決: 44

題目描述

如果乙個序列滿足下面的性質,我們就將它稱為擺動序列:

1.  序列中的所有數都是不大於k的正整數;

2.  序列中至少有兩個數。

3.  序列中的數兩兩不相等;

4.  如果第i  –  1個數比第i  –  2個數大,則第i個數比第i  –  2個數小;如果第i  –  1個數比第i  –  2個數小,則第i個數比第i  –  2個數大。

比如,當k  =  3時,有下面幾個這樣的序列:

1  2

1  3

2  1

2  1  3

2  3

2  3  1

3  1

3  2

一共有8種,給定k,請求出滿足上面要求的序列的個數。

輸入輸入包含了乙個整數k。(k< =20) 

輸出輸出乙個整數,表示滿足要求的序列個數。

樣例輸入

3
樣例輸出

8
思路:

dfs:記錄i-1和i-2狀態,那麼我們列舉當前是否可以放就可以了,長度》=2的時候就記錄答案。

dp:刷表法?好像這種玩意還挺好用?dp[k][len]代表為k時長度為len的有多少種,以k為縱座標,以len為橫座標,畫乙個矩陣,然後填數,前幾項是要自己手算出來,然後發現dp[i][j]=dp[i-1][j]+dp[i-1][j-1],對角線上都是2,第一列答案是i*(i-1)。

**1:

#include#include#define rep(i,a,b) for(int i=a;i<=b;i++)

#define dep(i,a,b) for(int i=a;i>=b;i--)

#define ll long long

#include#include#include#includeusing namespace std;

const int maxn=20+6;

#define mod 1000000007

#define inf 0x3f3f3f3f

int dx= ;

int dy= ;

int k;

int vis[maxn];

int ans=0;

void dfs(int prere,int pre,int len)

for(int i=1;i<=k;i++)

}else

;int dy= ;

int dp[maxn][maxn];

int main()

}int ans=0;

rep(i,2,k)

cout

}

藍橋杯擺動序列 DFS DP問題這個是DFS

藍橋杯擺動序列問題,這篇是dfs做的。鏈結如下 問題描述 如果乙個序列滿足下面的性質,我們就將它稱為擺動序列 1.序列中的所有數都是不大於k的正整數 2.序列中至少有兩個數。3.序列中的數兩兩不相等 4.如果第i 1個數比第i 2個數大,則第i個數比第i 2個數小 如果第i 1個數比第i 2個數小,...

擺動序列(DP)

演算法訓練 擺動序列 時間限制 1.0s 記憶體限制 512.0mb 問題描述 如果乙個序列滿足下面的性質,我們就將它稱為擺動序列 1.序列中的所有數都是不大於k的正整數 2.序列中至少有兩個數。3.序列中的數兩兩不相等 4.如果第i 1個數比第i 2個數大,則第i個數比第i 2個數小 如果第i 1...

376 擺動序列

如果連續數字之間的差嚴格地在正數和負數之間交替,則數字序列稱為擺動序列。第乙個差 如果存在的話 可能是正數或負數。少於兩個元素的序列也是擺動序列。例如,1,7,4,9,2,5 是乙個擺動序列,因為差值 6,3,5,7,3 是正負交替出現的。相反,1,4,7,2,5 和 1,7,4,5,5 不是擺動序...