试题 算法训练 摆动序列(蓝桥杯 C/C++)

**

试题 算法训练 摆动序列

**

资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
  如果一个序列满足下面的性质,我们就将它称为摆动序列:
  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

前言:

博主大二菜鸟一枚,假期备考蓝桥杯,第一次写博客,希望能在博客中一起分享自己学到的东西,然后把学到的东西以自己理解的样式更通俗地分享给大家,有不足的地方大家多多指正,和大佬们多多学习!

思路与想法:

首先这道题的思想是 dp动态规划,所谓动态规划是求解决策过程最优化的过程,往往是直接算出答案,而不是得出每一步得过程。

这道题并不能用遍历的思想来思考,比如你打算遍历每一种情况的序列,然后if满足某种形式count++这种一定是不行的,数据太大会超时或效率太低并且很复杂

动态规划都会用到二维数组,并且需要多重的循环来解题,这道题中我们会用到一个二维数组dp[20][20]来储存结果,具体下面会讲到数组的含义

那么这道题怎么去入手呢?
1、从题干中我们可以知道:每个序列中的数字数量一定大于等于2,并且小于等于k
例:k = 3时,序列可以是数量为2的1 2,也可以是数量为3的1 3 2(序列中的最大值不能大于k且最少为两个数字)

2、那么我们可以去自己把k较小时的序列情况在纸上写出来,找一些规律和思路(这往往是一些算法题的精髓)

当k = 2时,只有数量为2的序列:12或 21两种

当k = 3时,数量为2的序列:12, 13, 21, 23, 31, 32六种
数量为3的序列有213,231两种

当k = 4时,数量为2的序列有12,13,14,21,23,24,31,32,34,41,42,43共12种

数量为3的序列有:213,214,314,324,231,241,341,342共8种
(我们这时不难发现小大小和大小大的情况数量一样)

数量为4的序列有:2314,3241两种(大小大小 和 小大小大各一种)

那么我们将这个结果总结为下图:

(纵坐标代表k的值,横坐标代表当前的k下,n个数字组成的序列的种数)

规律
那么我们可以得出规律:
1、数字数量为2的序列一共有:k * (k - 1)

 			if(j == 2)
            {
   
                dp[i]
  • 17
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值