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

  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
    思路:一开始以为是记忆化搜索,但是没想出怎么记忆化,就暴力dfs+回溯试了一下,发现数列收敛的很快,没有特别长的那种,所以时间复杂度是允许的(k<=20)。
    代码如下:
#include<bits/stdc++.h>
#define ll long long
using namespace std;const int maxx=2e1+1;
int a[maxx],vis[maxx];
int n;inline void dfs(int num,int &ans)
{if(num>n) return ;if(num>=2){ans++;if(a[num]>a[num-1]) {for(int i=a[num-1]-1;i>=1;i--){if(vis[i]==0){a[num+1]=i;vis[i]=1;dfs(num+1,ans);vis[i]=0;a[num+1]=i;}}}else{for(int i=a[num-1]+1;i<=n;i++){if(vis[i]==0){a[num+1]=i;vis[i]=1;dfs(num+1,ans);vis[i]=0;a[num+1]=0;}}}}else{for(int i=a[num]-1;i>=1;i--){if(vis[i]==0){a[num+1]=i;vis[i]=1;dfs(num+1,ans);vis[i]=0;a[num+1]=0;}}for(int i=a[num]+1;i<=n;i++){if(vis[i]==0){a[num+1]=i;vis[i]=1;dfs(num+1,ans);vis[i]=0;a[num+1]=0;}}}
}
int main()
{scanf("%d",&n);int ans=0;memset(vis,0,sizeof(vis));for(int i=1;i<=n;i++){a[1]=i;vis[i]=1;dfs(1,ans);vis[i]=0;}cout<<ans<<endl;return 0;
}

如果k再大一点,dfs就不是那么好了,因为回溯耗时也很大。那么我们考虑dp的方式。我们可以根据dfs的结果,建立一个表,在里面寻找规律。如下图所示(图片来源):

纵坐标代表的是k的取值,横坐标代表的是在这k个数中选取的数的个数。
我们可以发现,横坐标为2的时候,答案总是(k-1)*k。横坐标再大的时候,我们就可以发现规律了。
状态转移方程:dp[i][j]=dp[i-1][j]+dp[i-1][j-1].
代码如下:

#include<bits/stdc++.h>
#define ll long long
using namespace std;const int maxx=2e2+100;
int dp[maxx][maxx];
int n;int main()
{scanf("%d",&n);for(int i=2;i<=n;i++) dp[i][2]=(i-1)*i;for(int j=3;j<=n;j++){for(int i=3;i<=n;i++) dp[i][j]=dp[i-1][j]+dp[i-1][j-1];}int ans=0;for(int i=2;i<=n;i++) ans+=dp[n][i];cout<<ans<<endl;return 0;
}

时间复杂度仅仅为O(n^2)。
努力加油a啊,(o)/~

[蓝桥杯][算法训练VIP]摆动序列(深搜+回溯||动态规划)相关推荐

  1. [蓝桥杯][算法训练VIP]黑白无常(dfs)

    题目描述 某寝室的同学们在学术完之后准备玩一个游戏: 游戏是这样的,每个人头上都被贴了一张白色或者黑色的纸,现在每个人都会说一句话"我看到x张白色纸条和y张黑色的纸条",又已知每个 ...

  2. 单词接龙 python_[蓝桥杯][算法训练VIP]单词接龙 (C++代码)

    解题思路: 注意事项: 参考代码: 首先在题意上可能有些误解. 两个单词合并时,合并部分取的是最小重叠部分 相邻的两部分不能存在包含关系就是说如果存在包含关系,就不能标记为使用过. 每个单词最多出现两 ...

  3. [蓝桥杯][算法训练VIP]王、后传说(深搜+回溯)

    题目描述 地球人都知道,在国际象棋中,后如同太阳,光芒四射,威风八面,它能控制横.坚.斜线位置. 看过清宫戏的中国人都知道,后宫乃步步惊心的险恶之地.各皇后都有自己的势力范围,但也总能找到相安无事的办 ...

  4. [蓝桥杯][算法训练VIP]旅行家的预算(单调栈+贪心)

    题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市 到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P ...

  5. [蓝桥杯][算法训练VIP]方格取数(双线程dp)

    题目描述 设有N * N的方格图(N< =10),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0. 某人从图的左上角的A 点(1,1)出发,可以向下行走,也可以向右走,直到到达右下 ...

  6. [蓝桥杯][算法训练VIP]接水问题(思维)

    题目描述 学校里有一个水房,水房里一共装有m个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为1.现在有n名同学准备接水,他们的初始接水顺序已经确定.将这些同学按接水顺序从1到n编号,i号同学的 ...

  7. [蓝桥杯][算法训练VIP]单词接龙(DFS+String)

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都 最多在"龙&quo ...

  8. [蓝桥杯][算法训练VIP]乘积最大(动态规划)

    题目描述 今年是国际数学联盟确定的"2000--世界数学年",又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一 ...

  9. [蓝桥杯][算法训练VIP]麦森数(Java大数+快速幂)

    题目描述 形如2p-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2p-1不一定也是素数.到1998年底,人们已找到了37个麦森数.最大的一个是P=3021377,它有9 ...

最新文章

  1. 机器学习理论篇:机器学习的数学基础
  2. 协方差、协方差矩阵的解释意义
  3. BootStrap Table - JS事件绑定
  4. MFC常用类、成员函数、数组类、Cstring类、CTime类、CPoint类
  5. 音乐咖android,GitHub - hackers365/musicafe: musicafe音乐咖 — 网易、虾米、QQ音乐一处搞定...
  6. 请解释各种自动装配模式的区别?
  7. apply和call用法
  8. 电脑卡在正在启动windows界面_让 Linux 启动更快
  9. mac os 相关命令
  10. pyplot设置刻度字体大小以及标签字体大小
  11. asp.net弹出对话框
  12. 拓端tecdat|Python多项式Logistic逻辑回归进行多类别分类和交叉验证准确度箱线图可视化
  13. sphinx的php扩展,替php安装sphinx扩展
  14. php 检查货币类型_php型【货币问答】- php型所有答案 - 联合货币
  15. Error处理: android.media.MediaRecorder.start(Native Method) 报错:start failed: -19【转】
  16. workman 日志_Workman手册笔记一
  17. python键盘记录工具开发_多功能Python键盘记录工具:Radium
  18. html5超萌哈士奇,哈士奇,是一种让人又爱又恨,又拥有自己独特风格的雪橇犬...
  19. 皮尔逊相关系数实现相似K线及其性能优化
  20. 判断输入数是奇数还是偶数

热门文章

  1. C#之操作窗口模拟键鼠事件文件监控等知识使用
  2. matlab读取指定路径excel文件,MATLAB读取Excel文件
  3. php sqlserver开发实例,Linux_用sql脚本创建sqlserver数据库范例语句,下面是创建一个sqlserver数据库 - phpStudy...
  4. python开发pandas_二、Python开发---33、pandas(1)
  5. qt下设置按钮不接收键盘鼠标但能响应 clicked()信号
  6. webpack3 css,媒体查询不能使用CSS /样式加载器和Webpack3
  7. 深度思考的能力,决定了你能走多远
  8. mysql性能调整三板斧
  9. Beta冲刺博客集合贴
  10. 教你十分钟快速搭建springBoot项目实战