WooKinson

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
问题描述
  如果一个序列满足下面的性质,我们就将它称为摆动序列:
  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

 

记:

注意题目给的条件(当数字大于2时的条件判断,不满足时立即跳出)

 

AC代码:

 1 #include <stdio.h> 
 2 #define N 20
 3 
 4 int k;
 5 int count = 0;        
 6 int use[N+1] = {0};    /*数据存储*/
 7 int vis[N+1] = {0};    /*访问标记*/
 8 
 9 void dfs(int x)
10 {
11     int i,j;
12     int flag;
13     if (x >= 2)
14     {
15         count ++;            
16     }
17     
18     if (x > k)
19     {
20         return ;
21     }    
22     
23     for (i = 1 ; i <= k ; i ++)
24     {
25         if (!vis[i])
26         {        
27             flag = 0;                
28             use[x] = i;
29             for (j = x ; j >= 2 ; j --)
30             {
31                 if (use[j-1]>use[j-2] && use[j]>use[j-2])
32                 {                    
33                     flag = 1;
34                     break;
35                 }
36                 else if (use[j-1]<use[j-2] && use[j]<use[j-2])
37                 {
38                     flag = 1;
39                     break;
40                 }
41             }
42             if (flag)
43                 continue;
44             vis[i] = 1;
45             dfs(x+1);
46             vis[i] = 0;
47         }
48     }
49     
50     return ;
51 }
52 
53 int main(void)
54 {
55     scanf("%d",&k);
56     dfs(0);
57     printf("%d",count);
58     
59     return 0;
60 }

 

posted on 2018-03-25 19:32  WooKinson  阅读(867)  评论(0编辑  收藏  举报