演算法訓練 擺動序列
阿新 • • 發佈:2019-01-07
問題描述
如果一個序列滿足下面的性質,我們就將它稱為擺動序列:
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
輸出格式
輸出一個整數,表示滿足要求的序列個數。
樣例輸入
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; }
還有一種是數學規律