问题描述
  如果一个序列满足下面的性质,我们就将它称为摆动序列:

  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
 
思路:这个题与其说是动态规划,不如说是找规律。
1.k个数组成的k个数的摆动序列就只有两种。
2.k个数组成的2个数的摆动序列根据高二学的排列组合就是C2k*2,因为k中选2个数。
3.然后再找规律,四个数中选3个,就相当于四个数中选1个,即一共四种选法,而这每种选法构成的摆动序列只有两种,例如1 2 3 4,选1 2 3,构成的摆动序列就是2 1 3或者2 3 1,所以4选3构成8种摆动序列,然后继续推,得到一个表格就能找到其中的规律。

  2 3 4 5 6 7 8
2 2 0 0 0 0 0 0
3 6 2 0 0 0 0 0
4 12 8 2 0 0 0 0
5 20 20 10 2 0 0 0
6 30 40 30 12 2 0 0
7 42 70 70 42 14 2 0
8 56 112 140 112 56 16 2

 
 
 
 
 
 
 
 
横坐标表示k,纵坐标表示选取的个数。
所以第一列就是C2k*2,代码表示: memo[i][2] = i * i - i; 
剩下的就是 memo[i][j] = memo[i - 1][j] + memo[i - 1][j - 1] 
最后结果就是把k的那一行累加即可 res += memo[k][i]; 
代码
 1 #include<iostream>
2 #include<vector>
3 using namespace std;
4
5 int main()
6 {
7 int k;
8
9 cin >> k;
10 vector< vector<int> > memo(k+1, vector<int>(k+1,0));
11
12 for (int i = 2; i <= k; i++)
13 {
14 memo[i][2] = i * i - i; //Cn2*2;
15 }
16
17 for (int i = 3; i <= k; i++)
18 {
19 for (int j = 3; j <= k; j++)
20 {
21 memo[i][j] = memo[i - 1][j] + memo[i - 1][j - 1];
22 }
23 }
24
25 int res = 0;
26 for (int i = 2; i <= k; i++)
27 {
28 res += memo[k][i];
29 }
30
31 cout << res;
32 return 0;
33 }

DP:摆动序列的更多相关文章

  1. ALGO-9_蓝桥杯_算法训练_摆动序列(DP)

    问题描述 如果一个序列满足下面的性质,我们就将它称为摆动序列: . 序列中的所有数都是不大于k的正整数: . 序列中至少有两个数. . 序列中的数两两不相等: . 如果第i – 1个数比第i – 2个 ...

  2. LeetCode——376.摆动序列

    如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在的话)可能是正数或负数.少于两个元素的序列也是摆动序列. 例如, [1,7,4,9,2,5] 是一个摆动序列, ...

  3. Java 第十一届 蓝桥杯 省模拟赛 正整数的摆动序列

    正整数的摆动序列 问题描述 如果一个序列的奇数项都比前一项大,偶数项都比前一项小,则称为一个摆动序列.即 a[2i]<a[2i-1], a[2i+1]>a[2i]. 小明想知道,长度为 m ...

  4. LeetCode算法训练-贪心算法 455.分发饼干 376. 摆动序列 53. 最大子序和

    欢迎关注个人公众号:爱喝可可牛奶 LeetCode算法训练-贪心算法 455.分发饼干 376. 摆动序列 53. 最大子序和 前置知识 贪心算法核心是找局部最优解,通过局部最优推导出全局最优 Lee ...

  5. [Swift]LeetCode376. 摆动序列 | Wiggle Subsequence

    A sequence of numbers is called a wiggle sequence if the differences between successive numbers stri ...

  6. Leetcode 376.摆动序列

    摆动序列 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在的话)可能是正数或负数.少于两个元素的序列也是摆动序列. 例如, [1,7,4,9,2,5] 是一个 ...

  7. Java实现 LeetCode 376 摆动序列

    376. 摆动序列 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在的话)可能是正数或负数.少于两个元素的序列也是摆动序列. 例如, [1,7,4,9,2,5 ...

  8. Java实现 蓝桥杯VIP 算法训练 摆动序列

    问题描述 如果一个序列满足下面的性质,我们就将它称为摆动序列: 1. 序列中的所有数都是不大于k的正整数: 2. 序列中至少有两个数. 3. 序列中的数两两不相等: 4. 如果第i – 1个数比第i ...

  9. 【LeetCode】NO.376 摆动序列 (Python) [贪心算法]

    376. 摆动序列 题目 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 .第一个差(如果存在的话)可能是正数或负数.仅有一个元素或者含两个不等元素的序列也视作摆动序列. 例 ...

  10. SYCOJ2100摆动序列

    题目-摆动序列 (shiyancang.cn) 直接分成两部分,插入即可.只有一个地方不对,那就是符号.两个大的放一个小的,两个小的放一个大的.那么每次的大的放最大的,每次的小的放其次小的,用完就不用 ...

随机推荐

  1. 手机免root安装最新青龙面板(非Alpine term | Zero term软件)

    使用软件:Termux 可以用于任何支持qemu虚拟机的环境.APP 制作了基本的系统环境.开发环境和青龙面板环境.多个虚拟机,按需求下载 官方网站:https://api.wer.plus 群:10 ...

  2. pandas 字典创建Dataframe

    所有的ndarrays必须具有相同的长度.如果传递了索引(index),则索引的长度应等于数组的长度.如果没有传递索引,则默认情况下,索引为range(n),其中n为数组长度. import pand ...

  3. 抽象类 vs 接口【概念解析系列_2】【C# 基础】

    〇.前言 抽象类和接口的相似之处还是很多的,但是它们的侧重点不同,本文将简单梳理下. 一.简介与示例 1.1 抽象类 抽象类就是不能使用 new 方法进行实例化的类,即没有具体实例对象的类. 抽象类有 ...

  4. 使用CoreDNS自建dns

    前言 公司有些内网服务需要使用域名访问,安装bind比较麻烦,故使用coredns实现域名服务. IP 说明 192.168.0.41 安装dns,作为dns服务器 192.168.0.20 测试服务 ...

  5. 接到一个新需求应该怎么做?(V1.0)

    接到一个新需求应该怎么做?(V1.0) 1 背景 在做业务研发的时候,经常会接到一些 产品需求/技术需求, 无论需求大小,都需要一套可以重复使用的方法论,来保证整个项目的正常交付,这篇思考就是总结梳理 ...

  6. 带你读论文丨Fuzzing漏洞挖掘详细总结 GreyOne

    本文分享自华为云社区<[论文阅读] (03) 清华张超老师 - Fuzzing漏洞挖掘详细总结 GreyOne>,作者: eastmount. 一.传统的漏洞挖掘方法 演讲题目: 数据流敏 ...

  7. KVM下windows由IDE模式改为virtio模式蓝屏 开不开机

    KVM安装Windows默认使用的是qemu虚拟化IDE硬盘模式,在这种情况下,IO性能比较低,如果使用virtio的方式可以提高虚拟机IO性能. 于是我想将这台虚拟机迁移到openstack中管理 ...

  8. uniapp 地图如何添加?你要的教程来喽!

    地图在 app 中使用还是很广泛的,常见的应用常见有: 1.获取自己的位置,规划路线. 2.使用标记点进行标记多个位置. 3.绘制多边形,使用围墙标记位置等等. 此篇文章就以高德地图为例,以上述三个常 ...

  9. Vue3中的几个坑,你都见过吗?

    Vue3 目前已经趋于稳定,不少代码库都已经开始使用它,很多项目未来也必然要迁移至Vue3.本文记录我在使用Vue3时遇到的一些问题,希望能为其他开发者提供帮助. 1. 使用reactive封装基础数 ...

  10. 使用MySQL存储过程提高数据库效率和可维护性

    MySQL 存储过程是一种强大的数据库功能,它允许你在数据库中存储和执行一组SQL语句,类似于编程中的函数.存储过程可以大幅提高数据库的性能.安全性和可维护性.本文将详细介绍MySQL存储过程的使用. ...