POJ 1836 Alignment

有一排人,身高可能不同,现在有一个理想状态是这排的每个人向左或向右看没有被挡住视野(当遇到等高或更高的人时会被挡住),现在问最少让几人出列可以达到这个理想状态。

最少人出列,其实就是一个人数最多的理想状态。求一个人数最多的类似"山峰"的高度排列。那就可以从左到右、从右到左各求一遍LIS

 

开始用 O(n2)的写法WA了,错在搞错dp[i] 的含义,dp[i]代表以i为尾的LIS,最后输出答案时应该枚举 dp[i]+dp[j]

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 int height[1024];
 6 int dp1[1024];//up
 7 int dp2[1024];//down
 8 
 9 int main(){
10     int N;
11     scanf("%d",&N);
12     for(int i=0;i<N;++i){
13         double tmp;
14         scanf("%lf",&tmp);
15         height[i]=tmp*100000+0.1;
16     }
17     for(int i=0;i<N;++i){
18         dp1[i]=1;
19         for(int j=0;j<i;++j){
20             if(height[j]<height[i]) dp1[i]=max(dp1[i],dp1[j]+1);
21         }
22     }
23     for(int i=N-1;i>=0;i--){
24         dp2[i]=1;
25         for(int j=N-1;j>i;--j){
26             if(height[j]<height[i]) dp2[i]=max(dp2[i],dp2[j]+1);
27         }
28     }
29     //for(int i=0;i<N;++i) printf("i : %d\tup: %d , down: %d\n",i,dp1[i],dp2[i]);
30     int ans=-1;
31     //ans=max(ans,dp2[0]);
32     //for(int i=0;i<N-1;++i)ans=max(ans,dp1[i]+dp2[i+1]);
33     //ans=max(ans,dp1[N-1]);
34     for(int i=0;i<N;++i)
35         for(int j=i+1;j<N;++j)
36             ans=max(ans,dp1[i]+dp2[j]);
37     printf("%d\n",N-ans);
38 }
View Code

 

用O(nlogn)的写法

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 const int INF=0x3f3f3f3f;
 6 int height[1024];
 7 int dp1[1024];//up
 8 int dp2[1024];//down
 9 int S[1024];
10 int tot;
11 
12 int B_S(int l,int r,int ob){
13     int mid;
14     r--;
15     while(l<=r){
16         mid=(l+r)>>1;
17         if(S[mid]>ob) r=mid-1;
18         else l=mid+1;
19     }
20     return l;
21 }
22 
23 int main(){
24     int N;
25     scanf("%d",&N);
26     for(int i=0;i<N;++i){
27         double tmp;
28         scanf("%lf",&tmp);
29         height[i]=tmp*100000+0.1;
30     }
31     
32     fill(S,S+N,INF);
33     for(int i=0;i<N;++i){
34         int pos=lower_bound(S,S+N,height[i])-S;
35         dp1[i]=pos+1;
36         S[pos]=height[i];
37     }
38     fill(S,S+N,INF);
39     for(int i=N-1;i>=0;i--){
40         int pos=lower_bound(S,S+N,height[i])-S;
41         dp2[i]=pos+1;
42         S[pos]=height[i];
43     }
44     //for(int i=0;i<N;++i) printf("i : %d\tup: %d , down: %d\n",i,dp1[i],dp2[i]);
45     int ans=-1;
46     //ans=max(ans,dp2[0]);
47     //for(int i=0;i<N-1;++i)ans=max(ans,dp1[i]+dp2[i+1]);
48     //ans=max(ans,dp1[N-1]);
49     for(int i=0;i<N;++i)
50         for(int j=i+1;j<N;++j)
51             ans=max(ans,dp1[i]+dp2[j]);
52     printf("%d\n",N-ans);
53 }
View Code
 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 int height[1024];
 6 int dp1[1024];//up
 7 int dp2[1024];//down
 8 int S[1024];
 9 int tot;
10 
11 int B_S(int l,int r,int ob){
12     int mid;
13     r--;
14     while(l<=r){
15         mid=(l+r)>>1;
16         if(S[mid]>ob) r=mid-1;
17         else l=mid+1;
18     }
19     return l;
20 }
21 
22 int main(){
23     int N;
24     scanf("%d",&N);
25     for(int i=0;i<N;++i){
26         double tmp;
27         scanf("%lf",&tmp);
28         height[i]=tmp*100000+0.1;
29     }
30     tot=0;
31     for(int i=0;i<N;++i){
32         if(tot==0||S[tot-1]<height[i]) S[tot++]=height[i];
33         else{
34             //int pos=B_S(0,tot,height[i]);
35             int pos=lower_bound(S,S+tot,height[i])-S;
36             S[pos]=height[i];
37         }
38         dp1[i]=tot;
39     }
40     tot=0;
41     for(int i=N-1;i>=0;i--){
42         if(tot==0||S[tot-1]<height[i]) S[tot++]=height[i];
43         else{
44             //int pos=B_S(0,tot,height[i]);
45             int pos=lower_bound(S,S+tot,height[i])-S;
46             S[pos]=height[i];
47         }
48         dp2[i]=tot;
49     }
50     //for(int i=0;i<N;++i) printf("i : %d\tup: %d , down: %d\n",i,dp1[i],dp2[i]);
51     int ans=-1;
52     //ans=max(ans,dp2[0]);
53     //for(int i=0;i<N-1;++i)ans=max(ans,dp1[i]+dp2[i+1]);
54     //ans=max(ans,dp1[N-1]);
55     for(int i=0;i<N;++i)
56         for(int j=i+1;j<N;++j)
57             ans=max(ans,dp1[i]+dp2[j]);
58     printf("%d\n",N-ans);
59 }
View Code

一种单调栈,一种从修改预设数组,都是二分

开始一直在用upper_bound,后来脑补跑数据才发现,upper_bound只能用来找不下降子序列,lower_bound是用来找严格上升子序列。

转载于:https://www.cnblogs.com/Kiritsugu/p/9581702.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266114.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ppt倒计时_年终会议做一个这样的倒计时PPT,保证惊艳全场!1分钟就能学会

倒计时动画很经常被用在一些产品的发布会或是新年晚会的现场&#xff0c;因为倒计时可以营造除以中紧张的氛围~那么我们常见的倒计时动画都是怎么做出来的呢&#xff1f;其实一点也不难&#xff0c;不需要任何专业的视频软件&#xff0c;只要用我们日常工作中最常用的PPT就能做…

修改Advance Template Jsp模板的编码格式

2019独角兽企业重金招聘Python工程师标准>>> windows ——》 preferences ——》MyEclipse——》Files and Editers——》JSP 在此widzard中修改相应的编码。 转载于:https://my.oschina.net/wangfree/blog/127313

ASP.NET Core ---日志

一、日志记录&#xff1a; 1、日志的作用&#xff1a; 程序中记录日志一般有两个目的&#xff0c;故障定位和显示程序运行状态。好的日志记录方式可以提供足够多定位问题的依据。 2、日志的等级&#xff1a; 有良好工作习惯的人&#xff0c;工作的时候会将领导交待下来的工作分…

circle函数用法 turtle_Python绘图库Turtle详细分析

关注Python学习交流学习更多Python知识Turtle库是Python语言中一个很流行的绘制图像的函数库&#xff0c;想象一个小乌龟&#xff0c;在一个横轴为x、纵轴为y的坐标系原点&#xff0c;(0,0)位置开始&#xff0c;它根据一组函数指令的控制&#xff0c;在这个平面坐标系中移动&am…

USB主机是如何检测到设备的插入的呢?

USB设备的插入检测机制 首先&#xff0c;在USB集线器的每个下游端口的D和D-上&#xff0c;分别接了一个15K欧姆的下拉电阻到地。这样&#xff0c;在集线器的端口悬空时&#xff0c;就被这两个下拉电阻拉到了低电平。而在USB设备端&#xff0c;在D或者D-上接了1.5K欧姆上拉电阻.…

单招计算机专业考多少分可以录取,单招考多少分能过?单招分数线

单独招生是高等职业院校的一种招生形式&#xff0c;和普通高考相比&#xff0c;虽然单招人数连年增加&#xff0c;但报考人数相比高考总人数还是略少的&#xff0c;竞争压力没有那么大&#xff0c;录取率相对高很多&#xff0c;基本不存在落榜&#xff0c;上大学更安全&#xf…

全国计算机等级考试题库二级C操作题100套(第97套)

更多干货推荐可以去牛客网看看&#xff0c;他们现在的IT题库内容很丰富&#xff0c;属于国内做的很好的了&#xff0c;而且是课程刷题面经求职讨论区分享&#xff0c;一站式求职学习网站&#xff0c;最最最重要的里面的资源全部免费&#xff01;&#xff01;&#xff01;点击进…

【job】2013年5-5阿里巴巴暑期实习招聘笔试题目及部分答案

网上各种标为2013年&#xff0c;实际上都是2012年或者更早的&#xff0c;下面的才是真正的2013年5月5日考试的卷子。 答题说明&#xff1a; 1.答题时间90分钟&#xff0c;请注意把握时间&#xff1b; 2.试题分为四个部分&#xff1a;单项选择题&#xff08;10题&#xff0c;20分…

Linux进程间通信(管道、消息队列、共享内存、信号、信号量)

目录Linux进程间通信概述1.管道无名管道(pipe)有名管道(fifo)2.消息队列(msg)消息队列的通信原理消息队列相关api消息队列收发数据键值生成消息队列移除3.共享内存(shm)4.信号(sig)信号概述信号编程&#xff08;入门&#xff09;信号携带消息&#xff08;高级&#xff09;5.信号…

Eclipse上GIT插件EGIT使用手册之五_查看历史记录

Team -> Show in history可以查看版本历史提交记录 可以选择对比模式

solr7.4 centos7安装

环境&#xff1a;centos7、JDK1.8、solr 自带Jetty启动 一、安装JDK1.8环境 1、下载JDK jdk-8u172-linux-x64.rpm 下载地址&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2、安装JDK rpm -ivh jdk-8u131-linux-x64.rpm 3、…

How to Fix an App that Crashes in Release but n...

2019独角兽企业重金招聘Python工程师标准>>> 今天在测试app时&#xff0c;发现app store上版本有奔溃现象&#xff0c;但是直接用xcode跑本地程序没问题。猜测release&debug版本造成的&#xff0c;后发现targets的 optimization level设置问题&#xff0c;将rel…

斐波那契数列c++代码_轮到你了,斐波那契数列!

前阵子&#xff0c;日剧“轮到你了”终于大结局了&#xff0c;虽然结局有点一言难尽&#xff0c;但黑岛和二阶堂两个学霸之间的爱情&#xff0c;还是很甜呢呐&#xff01;两个学霸之间的默契的斐波那契数列也被许多网友认为是凶手行凶的依据。到底这数列有啥神奇之处&#xff0…

悖论对计算机科学影响,引力波的发现对计算机科学有什么意义?

满意答案saihdfa2016.02.28采纳率&#xff1a;43% 等级&#xff1a;10已帮助&#xff1a;420人引力波的发现对计算机科学的意义&#xff1a;允许引力波携带有更多的之前从未被观测过的信息。引力波有两个非常重要而且比较独特的性质。第一&#xff1a;不需要任何的物质存在于…

全国计算机等级考试题库二级C操作题100套(第98套)

更多干货推荐可以去牛客网看看&#xff0c;他们现在的IT题库内容很丰富&#xff0c;属于国内做的很好的了&#xff0c;而且是课程刷题面经求职讨论区分享&#xff0c;一站式求职学习网站&#xff0c;最最最重要的里面的资源全部免费&#xff01;&#xff01;&#xff01;点击进…

光动能表怎么维护_西铁城手表推荐,西铁城光动能表推荐选购指南

有的朋友们在京东上面看到款式多样的西铁城手表和西铁城光动能手表的时候&#xff0c;不知道怎么选择哪一款适合自己佩戴的&#xff1f;那么今天我就通过这篇文章&#xff0c;跟大家详细的分享一下关于西铁城手表的知识。让大家在选购的时候更加清晰明了的知道哪一款适合自己。…

python-2:工欲善其事,必先利其器 修改jupyter保存文件目录(亲测)

在桌面上创建 Jupyter Notebook快捷方式图标.将打开的Jupyter Notebook程序关闭&#xff0c;然后找到桌面快捷方式&#xff0c;右键>属性&#xff0c;然后把目标后面输入框最后的“%USERPROFILE%”这个参数去掉后&#xff0c;确定。否则之后做的其它修改无法生效。打开 cmd …

全国计算机等级考试题库二级C操作题100套(第99套)

更多干货推荐可以去牛客网看看&#xff0c;他们现在的IT题库内容很丰富&#xff0c;属于国内做的很好的了&#xff0c;而且是课程刷题面经求职讨论区分享&#xff0c;一站式求职学习网站&#xff0c;最最最重要的里面的资源全部免费&#xff01;&#xff01;&#xff01;点击进…

全国计算机等级考试题库二级C操作题100套(第100套)

更多干货推荐可以去牛客网看看&#xff0c;他们现在的IT题库内容很丰富&#xff0c;属于国内做的很好的了&#xff0c;而且是课程刷题面经求职讨论区分享&#xff0c;一站式求职学习网站&#xff0c;最最最重要的里面的资源全部免费&#xff01;&#xff01;&#xff01;点击进…