博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
导弹拦截n logn的算法(单调性)洛谷1020
阅读量:6296 次
发布时间:2019-06-22

本文共 1171 字,大约阅读时间需要 3 分钟。

这是我动态规划单调性算法的第一篇题解,写的不好请各位神犇提出建议(我在luogu上也写了这个的)

/*这道题要一个神奇的思想(我无法证明),那就是,求一个序列里面最少有多少最长不上升序列等于求这个序列里最长上升序列的长度。我们用f[x]数组(第一问)来记录当前长度为x的不上升序列中最大的结束点(这个运用了贪心的思想),如果当前数小于等于当前的最长不上升序列的结束点,那么我们把当前最长的不上升序列长度加一,把当前数作为这个 不下降序列的结束点,不然我们就用二分查找(为什么可以呢?这是因为我们运用了贪心的思/想后能保证长度越大的不上升序列结束点越小),试着用当前数去更新长度为x的不上升序列的结束点(又是贪心的思想,只更新长度最长且结束点小于自己的),然后第二问你再反着做就行了(把大于等于改为小于)*/

#include
#include
#include
using namespace std;const int maxn=100005;int a[maxn];int f[maxn];int main(){ int n=0; int l,r,mid; while(scanf("%d",&a[++n])!=EOF)continue; n--; f[0]=1234123412;//这个数要大于50000,不然可能你就无法更新 int ans1=0; for(int i=1;i<=n;i++){ if(f[ans1]>=a[i]){ f[ans1+1]=a[i];//结束点为a[i] ans1++; //当前最长不上升序列的长度加一 } else {
//二分查找 l=0;r=ans1; while(l
=a[i])l=mid+1; else { r=mid; } } if(l!=0)f[l]=a[i]; } } cout<
<
=a[i])r=mid; else { l=mid+1; } } f[l]=a[i]; } } cout<
<

转载于:https://www.cnblogs.com/c201904xyorz/p/9990794.html

你可能感兴趣的文章
Oracle 内存一 手动内存管理,自动内存管理
查看>>
我的友情链接
查看>>
日常工作问题的处理流程
查看>>
Mysql学习笔记【原创】
查看>>
ssm配置多数据库支持
查看>>
JVM内存分配与垃圾回收浅析
查看>>
java5线程池
查看>>
性能监控-Top
查看>>
request.getParameterMap()的坑
查看>>
三种提取 网卡的方法
查看>>
岗位角×××感管理
查看>>
5款常见原型工具,产品特色知多少?
查看>>
我的友情链接
查看>>
ASP.NET 大文件下载的实现思路及代码
查看>>
win2008 域服务器搭建教程
查看>>
不用Office自动化技术,给Word文档中填充赋值
查看>>
演示:IPv6全球单播地址的配置
查看>>
JS字符串的下划线命名和驼峰命名转换
查看>>
我的友情链接
查看>>
我的第一篇博文
查看>>