文章目录

  • 题目描述
  • 解析
    • 1.n^2^朴素算法
    • 2.队列nlogn算法
      • 代码
    • 3.二维DP(n^2^)
      • 代码
  • thanks for reading!

题目描述

五一到了,PKU-ACM队组织大家去登山观光,队员们发现山上一个有N个景点,并且决定按照顺序来浏览这些景点,即每次所浏览景点的编号都要大于前一个浏览景点的编号。同时队员们还有另一个登山习惯,就是不连续浏览海拔相同的两个景点,并且一旦开始下山,就不再向上走了。队员们希望在满足上面条件的同时,尽可能多的浏览景点,你能帮他们找出最多可能浏览的景点数么?

输入
Line 1: N (2 <= N <= 1000) 景点数
Line 2: N个整数,每个景点的海拔
输出
最多能浏览的景点数
样例输入
8
186 186 150 200 160 130 197 220
样例输出
4

解析

三种方法:

1.n2朴素算法

就是前后各跑一遍最长上升序列,然后扫一遍进行最优决策:

for(int i=1;i<=n;i++) ans=max(ans,x[i]+y[i]-1);

代码就不贴了

2.队列nlogn算法

就是第一个使用队列的优化,但是没有一次AC
因为这里虽然是最长上升,但是不能取等,所以应该使用lowwerbound!
机制也不难理解,因为不带等,所以队列中显然不能有一样的元素
找个简单的例子就能很容易的看出来:

输入:
1 5 8 5 7
过程:
i=1: 1
i=2: 1 5
i=3: 1 5 8
i=4: 1 5(相当于把自己替换) 8
i=5: 1 5 7
ans=3

如果用upperbound显然就会错误
这个收获挺大的
学废了

代码

#include<bits/stdc++.h>
using namespace std;
const int N=150;
int n,m;
int a[N],x[N],y[N];
int q[N],ed;
int main(){scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=1;i<=n;i++){if(a[i]>q[ed]) q[++ed]=a[i];else{int pl=lower_bound(q+1,q+1+ed,a[i])-q;q[pl]=a[i];}x[i]=ed;}memset(q,0,sizeof(q));ed=0;for(int i=n;i>=1;i--){if(a[i]>q[ed]) q[++ed]=a[i];else{int pl=lower_bound(q+1,q+1+ed,a[i])-q;q[pl]=a[i];}y[i]=ed;}int ans=0;for(int i=1;i<=n;i++) ans=max(ans,x[i]+y[i]-1);printf("%d",n-ans);return 0;
}
/*
8
186 186 150 200 160 130 197 220
*/

3.二维DP(n2)

就是再加一维状态记录是否开始增减
这样代码会很短
但复杂度还是平方
但是:
这个和朴素最长单调序列一样,最优答案未必在最后!

代码

#include<bits/stdc++.h>
using namespace std;
const int N=150;
int n,m;
int a[N],dp[N][3];
int main(){scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=1;i<=n;i++){dp[i][1]=dp[i][2]=1;for(int j=1;j<i;j++){if(a[j]<a[i]) dp[i][1]=max(dp[i][1],dp[j][1]+1);else if(a[j]>a[i]){dp[i][2]=max(dp[i][2],dp[j][2]+1);dp[i][2]=max(dp[i][2],dp[j][1]+1);}}}printf("%d",n-max(dp[n][1],dp[n][2]));return 0;
}
/*
5
3
*/

thanks for reading!

不止代码:合唱队列(动态规划)相关推荐

  1. P2642 双子序列最大和(线性DP)(最大子段和 + 合唱队列)

    P2642 双子序列最大和 首先考虑单个的最大子序列和 f[i] = max(f[i - 1] + a,a);ans = max(ans,f[i]); 这里的预处理方法类似合唱队列我们处理pre和ne ...

  2. 弗雷歇距离的原理及python代码实现(动态规划)

    弗雷歇距离的原理及python代码实现(动态规划) 在网上看了很多关于弗雷歇距离的介绍,结合自己的理解,出一版更通俗易懂.更清晰具体的解释. 最简单的解释自然是最短狗绳长度,但我将从另一个角度来解释它 ...

  3. 不止代码,职业发展黄金手册

    花了小半天时间,读完了阿里人出品的<不止代码,职业发展黄金手册>,记录下其中的诸多闪光点. 如何快速成长为技术大牛? 做的更多,做的比你主管安排给你的任务更多. 需求分析的时候更加准确,能 ...

  4. 不止代码:友好城市(动态规划)

    解析 先按左端点排序得到一个右端点的新队列,然后就可以发现: 所有合法的方案都是新队列的一个单调递增队列 然后就转化成了最长上升序列的问题 代码 #include<bits/stdc++.h&g ...

  5. 不止代码:机器分配(动态规划)

    题目描述 解析 头疼 什么破题 就是一个dp寻找最优性决策的常规题 但是要输出过程,可以使用递归输出 但是! 这题数据的意思是:存在a[i]=a[i+1]的情况,且在不影响利润的情况下,机器要尽可能的 ...

  6. 消费端代码获取队列名称_B端产品要懂的技术

    产品经理日常工作有研究用户需求,对用户行为结果负责,通过使用各种方法以及整合资源,来满足用户需求,形成产品价值,为企业带来预期收益.根据受众用户不同,又分为ToC和ToB两类产品. ToC类的产品是面 ...

  7. 动态规划立体匹配代码_411,动态规划和递归求不同路径 II

    问题描述 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为& ...

  8. rabbitmq 消费端代码获取队列名称_C#调用RabbitMQ实现消息队列的示例代码

    前言 我在刚接触使用中间件的时候,发现,中间件的使用并不是最难的,反而是中间件的下载,安装,配置才是最难的. 所以,这篇文章我们从头开始学习RabbitMq,真正的从头开始. 关于消息队列 其实消息队 ...

  9. rabbitmq 消费端代码获取队列名称_RabbitMQ四:生产者--队列--消费者

    AMQP协议的梳理和名词解析 建议先把上篇AMQP协议先看一遍,理解一下,由于用XMind绘图,电脑屏幕比较小,不能截取全部,如果想要全图和源代码,请下面留言....... 可以点击图片,打开到新的页 ...

最新文章

  1. Python2+Selenium入门03-元素定位
  2. Linux中的 inode以及 软硬链接分析
  3. 《转》java URL重写
  4. java uri_Android中的Uri与Java中的URI类
  5. elementui下拉框选择图片_element ui下拉框如何实现默认选择?
  6. oauth2和jwt_使用具有OAuth2的Web应用程序和JWT的使用来调用API – WSO2 API Manager
  7. cba比赛比分预测_【CBA直播】深圳vs广东前瞻:深圳战广东再掀反攻?
  8. (转)Spring Boot 2 (三):Spring Boot 开源软件都有哪些?
  9. c语言单词的一个字母变换,c语言:输入一行英文字符串,把每个单词第一个字母变为大写,输出修改后的字符串知道...
  10. 域名解析中的cname解析和显性URL跳转和隐性URL跳转三者有什么区别
  11. python精彩编程200例-python趣味编程100例(99个)
  12. 最简单的视音频播放示例2:GDI播放YUV, RGB
  13. mqtt客户端工具_如何在 Rust 中使用 MQTT
  14. java定义用户类_用户定义的值类在Java中看起来像什么?
  15. 最短路 POJ2387
  16. QT读取局域网共享文件夹文件内容 解决不同网段无法访问共享文件夹问题
  17. The Sultan's Successors (八皇后)
  18. 经验总结-显示驱动常见的通用问题
  19. CSAPP_Chapter1
  20. 解决Linux上steam更新游戏后导致版本不一致连接失败的问题

热门文章

  1. sklearn集合算法预测泰坦尼克号幸存者
  2. php 信号量 关闭,php 信号量
  3. min里所有的参数都不存在_高中生物所有的考点难点,其实都在你不仔细看的课本里,必修1-3超强记忆手册!...
  4. 表3.5 文章管理测试用例表_本地管理表空间管理机制
  5. 每天的0点php,使用strtotime,这个月的第一天凌晨0点在PHP?(Using just strtotime, 0 am first day of this month in PHP?)...
  6. python 日期格式校验_python – 如何验证时间格式?
  7. wordpress多站点主站调用分站最新文章_企业网站SEO最新的7个优化步骤!
  8. aspose excel中文文档_除了VBA,还有哪些编程语言可以操作Excel文件?
  9. 机器学习——文件的读取
  10. 数据结构——括号匹配问题