TYVJ P1067 合唱队形 Label:上升子序列?
背景
描述
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足T1<...<Ti>Ti+1>…>TK(1<=i<=K)。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
输入格式
输出格式
测试样例1
输入
8
186 186 150 200 160 130 197 220
输出
4
备注
对于全部的数据,保证有n<=100。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 1<<30
using namespace std;
int N,res=INF,a[],b[],dp[],f[],l,r;
int longest(int k){
fill(dp,dp+N,INF);
for(int i=;i<=k;i++){
*lower_bound(dp,dp+N,a[i])=a[i];
if(i==k) l=lower_bound(dp,dp+N,INF)-dp;
}
// printf("k=%d l=%d ",k,l);
fill(dp,dp+N,INF);
for(int i=;i<=N-k+;i++){
*lower_bound(dp,dp+N,b[i])=b[i];
if(i==N-k+) r=lower_bound(dp,dp+N,INF)-dp;
}
// printf("r=%d\n",r);
if(r==||l==) return -;
return l+r-;
}
int main(){
// freopen("01.txt","r",stdin);
scanf("%d",&N);
for(int i=;i<=N;i++) scanf("%d",&a[i]);
for(int i=;i<=N;i++) b[i]=a[N-i+];
// for(int i=1;i<=N;i++) printf("%d ",b[i]); for(int i=;i<=N;i++){
int k=longest(i);
if(k==-) k=INF;
else k=N-k;
res=min(res,k);
} if(res==INF) res=;
printf("%d\n",res);
return ;
}直接顺序读入a数组,再逆序复制一份到b,枚举中间点,过一下最长上升子序列,
记录当中间点推入时的序列长度,得到最小值;
其实可以不用逆序复制,为了不浪费时间,采用了O(nlogn)的lower_bound;
看了下题解发现本来就是上升或下降(即没有答案时)要输出0
非二分做法如下
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define inf 0x3f3f3f3f
using namespace std;
int a[],zuo[],you[],N;
int zuo_(){
fill(zuo,zuo+,);
for(int i=;i<=N;i++){
for(int j=i+;j<=N;j++){
if(a[j]>a[i]) zuo[j]=max(zuo[j],zuo[i]+);
}
}
}
int you_(){
fill(you,you+,);
for(int i=N;i>=;i--){
for(int j=i-;j>=;j--){
if(a[j]>a[i]) you[j]=max(you[j],you[i]+);
}
}
}
int main(){
freopen("01.txt","r",stdin);
scanf("%d",&N);
for(int i=;i<=N;i++)
scanf("%d",&a[i]); zuo_();
you_();
int ans=; for(int i=;i<=N;i++)
ans=max(ans,zuo[i]+you[i]-);
if(ans==) puts("");
else printf("%d\n",N-ans);
return ;
}
TYVJ P1067 合唱队形 Label:上升子序列?的更多相关文章
- tyvj 1067 合唱队形 dp LIS
P1067 合唱队形 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2004 提高组 第三道 描述 N位同学站成一排,音乐老师要请其中的(N ...
- NOIP200407合唱队形+最长上升子序列O(n^2)详解
合唱队形解题报告 2016-05-12 4:30——6:45 NOIP200407合唱队形 难度级别:A: 运行时间限制:1000ms: 运行空间限制:256000KB: 代码长度限制:20000 ...
- NOIP 2004 T3 合唱队形(DP、最长上升/下降子序列)
链接:https://ac.nowcoder.com/acm/contest/1082/C来源:牛客网 题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队 ...
- 九度OJ 1131 合唱队形 -- 动态规划(最长递增子序列)
题目地址:http://ac.jobdu.com/problem.php?pid=1131 题目描述: N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合 ...
- 洛谷 P1091 合唱队形
\[传送门在这里呀\] 题目描述 \(N\)位同学站成一排,音乐老师要请其中的\((N-K)\)位同学出列,使得剩下的\(K\)位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次 ...
- 洛谷p1091合唱队形题解
题目 合唱队形首先要满足的是从1这个位置到中间任意的位置为单增的,从中间任意的位置到最后是单减的,且长度最长.这样才能满足出列的同学最少. 如果要满足这个条件那么我们可以先预处理出每个点的从前找的最长 ...
- (LIS) P1091 合唱队形 洛谷
题目描述 NN位同学站成一排,音乐老师要请其中的(N-KN−K)位同学出列,使得剩下的KK位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2,…,K1,2,…,K,他 ...
- JOBDU 题目1131:合唱队形
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4546 解决:1445 题目描述: N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合唱队形. ...
- vijos 1098 合唱队形 - 动态规划
描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…, ...
随机推荐
- javascript return false 详解
在大多数情况下,为事件处理函数返回false,可以防止默认的事件行为.例如,默认情况下点击一个<a>元素,页面会跳转到该元素href属性指定的页. Return False 就相当于终止符 ...
- centos7 安装kvm, 并创建虚拟机
# yum –y install qemu-kvm qemu-img bridge-utils # yum –y install libvirt virt-install virt-manager # ...
- HTTP认证相关
Java HTTPBasicAuth http://blog.csdn.net/kkdelta/article/details/28419625Python HTTPBasicAuth http:// ...
- Session入门
Session是运行在服务器的,不可造假,例如:医生需要一个私人账本,记录病人编号和身份的对应关系.由于身份证无法造假,所以能够保证信息不被假冒.两点:身份证无法造假,这个身份证就可以唯一标识这个用户 ...
- 一、HTML和CSS基础--网页布局--实践--导航条菜单的制作
案例一:导航菜单的制作 垂直菜单
- Java IO流系统整理
Java IO流的分类 Java中的流,可以从不同的角度进行分类. 按流向分类: 输入流: 程序可以从中读取数据的流.输出流: 程序能向其中写入数据的流. 按数据传输单位分类: 字节流:以字节(8位二 ...
- linux tricks 之VA系列函数.
VA函数(variable argument function),参数个数可变函数,又称可变参数函数.C/C++编程中,系统提供给编程人员的va函数很少.*printf()/*scanf()系列函数, ...
- thinkphp验证码使用
在thinkphp中使用验证码很容易,只要调用thinkphp现有的方法就可以.当然,php的GD库肯定是要开的(就是在php.ini中要加载gd模块). thinkphp 3.1 --------- ...
- NDK开发
1 CDT 是 Eclipse 插件,它将把 Eclipse 转换为功能强大的 C/C++ IDE. C/C++在Eclipse平台下的开发工具.它提供的功能包括:C/C++编辑器(一些基本的功能:语 ...
- MATLAB信号与系统分析(一)——连续时间信号与系统的时域分析
一.连续时间信号的表示: 1.向量表示法: 在MATLAB中,是用连续信号在等时间间隔点的样值来近似表示连续信号,当取样时间间隔足够小时,这些离散的样值就能较好地近似出连续信号. 对于连续时间信号f( ...