1. 程式人生 > >演算法訓練 擺動序列

演算法訓練 擺動序列

問題描述

  如果一個序列滿足下面的性質,我們就將它稱為擺動序列:
  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

//有個問題  就是陣列a和vis 裡面的必須是 n+1, 或者清零的時候sizeof()+4      也可以直接開個大陣列

#include<stdio.h>
#include <string.h>

int n;
int ans = 0;

bool judge(int x, int y, int *a)
{
    if(y == 0 || y == 1 ||(a[y - 1]-a[y - 2])*(x-a[y - 2])<0)
        return true;

    return false;
}

void dfs(int cnt, int *a, int *vis)
{
  //  if(cnt == n)
  //      return;

    for (int i = 1; i <= n; i++)
    {
        if(!vis[i] && judge(i, cnt, a))
        {
            vis[i] = 1;
            a[cnt] = i;
            if(cnt >= 1)
                ans++;
            dfs(cnt+1, a, vis);
            vis[i] = 0;
        }
    }
}

int main()
{

    scanf("%d", &n);

    int a[n+1];
    int vis[n+1];
    memset(a, 0, sizeof(a));
    memset(vis, 0, sizeof(vis));
    
    dfs(0, a, vis);
    printf("%d\n", ans);
    return 0;
}

還有一種是數學規律