POJ1836 Alignment(LIS)
题目链接。
分析:
从左向右求一遍LIS,再从右向左求一遍LIS,最后一综合,就OK了。
注意:
有一种特殊情况(详见discuss):
8
3 4 5 1 2 5 4 3
答案是:2
AC代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue> using namespace std; const int maxn = + ;
const double INF = 1e100; double a[maxn];
int d1[maxn], d2[maxn];\ int main() {
int n;
// freopen("my.txt", "r", stdin); while(cin>>n) {
for(int i=; i<n; i++) cin>>a[i]; d1[] = ;
for(int i=; i<n; i++) {
int m = ;
for(int j=; j<i; j++) {
if(a[j] < a[i] && m < d1[j]) m = d1[j];
}
d1[i] = m+;
} d2[n-] = ;
for(int i=n-; i>=; i--) {
int m = ;
for(int j=n-; j>i; j--) {
if(a[j] < a[i] && m < d2[j]) m = d2[j];
}
d2[i] = m+;
} int ans = ;
for(int i=; i<n; i++) {
for(int j=i+; j<n; j++) {
ans = max(ans, d1[i]+d2[j]);
}
}
printf("%d\n", n-ans);
} return ;
}
加个二分写法,在《训练指南》上学的二分写法,解题思想一样,写法不一样而已。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <algorithm> using namespace std; const int maxn = + ;
const double INF = 1e100; double a[maxn];
int d1[maxn], d2[maxn];
double G[maxn]; int main() {
int n;
//freopen("my.txt", "r", stdin);
while(cin>>n) {
for(int i=; i<n; i++) cin>>a[i]; for(int i=; i<=n; i++) G[i] = INF;
for(int i=; i<n; i++) {
int k = lower_bound(G+, G+n+, a[i]) - G;
G[k] = a[i];
d1[i] = k;
} for(int i=; i<=n; i++) G[i] = INF;
for(int i=n-; i>=; i--) {
int k = lower_bound(G+, G+n+, a[i]) - G;
G[k] = a[i];
d2[i] = k;
} int ans = ;
for(int i=; i<n; i++) {
for(int j=i+; j<n; j++) {
ans = max(ans, d1[i]+d2[j]);
}
}
printf("%d\n", n-ans);
} return ;
}
POJ1836 Alignment(LIS)的更多相关文章
- POJ1836:Alignment(LIS的应用)
题目链接:http://poj.org/problem?id=1836 题目要求: 给你n个数,判断最少去掉多少个数,从中间往左是递减的序列,往右是递增的序列 需注意的是中间可能为两个相同的值,如 1 ...
- POJ1836 - Alignment(LIS)
题目大意 一队士兵排成一条直线,问最少出队几个士兵,使得队里的每个士兵都可以看到又端点或者左端点 题解 从左往右搞一遍LIS,然后从右往左搞一遍LIS,然后枚举即可... 代码: #include&l ...
- poj1836 Alignment
Alignment Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 11707 Accepted: 3730 Descri ...
- POJ 1836 Alignment --LIS&LDS
题意:n个士兵站成一排,求去掉最少的人数,使剩下的这排士兵的身高形成“峰形”分布,即求前面部分的LIS加上后面部分的LDS的最大值. 做法:分别求出LIS和LDS,枚举中点,求LIS+LDS的最大值. ...
- POJ 1836 Alignment 最长递增子序列(LIS)的变形
大致题意:给出一队士兵的身高,一开始不是按身高排序的.要求最少的人出列,使原序列的士兵的身高先递增后递减. 求递增和递减不难想到递增子序列,要求最少的人出列,也就是原队列的人要最多. 1 2 3 4 ...
- POJ 1836 Alignment
Alignment Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 11450 Accepted: 3647 Descriptio ...
- UVa10534 - Wavio Sequence(LIS)
题目大意 给定一个长度为n的整数序列,求个最长子序列(不一定连续),使得该序列的长度为奇数2k+1,前k+1个数严格递增,后k+1个数严格递减.注意,严格递增意味着该序列中的两个相邻数不能相同.n&l ...
- POJ - 1836 Alignment (动态规划)
https://vjudge.net/problem/POJ-1836 题意 求最少删除的数,使序列中任意一个位置的数的某一边都是递减的. 分析 任意一个位置的数的某一边都是递减的,就是说对于数h[i ...
- POJ 1836-Alignment(DP/LIS变形)
Alignment Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 13465 Accepted: 4336 Descri ...
随机推荐
- 解决PyGObject在pydev下报错的问题
使用PyGObject在eclispe+pydev下写代码,由于库是动态链接的,pydev无法识别,所以检查语法的时候会报错,但是并不影响代码运行. 不过对于我这样由轻微强迫症的患者来说,看见代码报错 ...
- 每天进步一点点——Linux
http://blog.csdn.net/cywosp/article/category/443566/1
- [转] add-apt-repository
PS: 有些项目提供的是deb 地址,那么把deb地址加到repository里,下面是一个例子: sudo apt-get update sudo add-apt-repository 'deb h ...
- Android 模仿QQ空间风格的 UI(转)
本文内容 环境 演示模仿QQ空间风格的UI 虽然这个 UI 跟现在的QQ空间有点差别,但是也能学到很多东西. 下载 Demo 环境 Windows 7 64 位 Eclipse ADT V22.6.2 ...
- Android Studio学习随笔-移动动画的实现
在上一篇博客我已经讲述了三种事件的实现方法,而现在我用复用方法来实现控件的自动移动,当然要实现控件的移动,先得在activity_main.xml文件中放置一个控件,此处我放置的是一个button控件 ...
- Protostuff自定义序列化(Delegate)解析
背景 在使用Protostuff进行序列化的时候,不幸地遇到了一个问题,就是Timestamp作为字段的时候,转换出现问题,通过Protostuff转换后的结果都是1970-01-01 08:00:0 ...
- 利用iframe实现提交表单是页面部分刷新
直接上代码: <%@ page language="java" import="java.util.*" pageEncoding="utf-8 ...
- Android单位度量
px(像素):屏幕上的点. in(英寸):长度单位.mm(毫米):长度单位.pt(磅):1/72英寸.dp(与密度无关的像素):一种基于屏幕密度的抽象单位.在每英寸160点的显示器上,1dp = 1p ...
- POJ 1240 Pre-Post-erous! 解题报告
题意: 给出一个m叉树的前,后序遍历求这样的树有多少种. Solution: 我们知道前序遍历的第一个点一定是根节点,后序遍历的最后一个点一定是根节点. 由此,我们只一要确定对于每一个节点,它有多少个 ...
- 03_RHEL7.1去掉注册提示
# rpm –qa|grep subscription-manager 出现类似下面的代码: subscription-manager-firstboot-1.13.22-1.el7.x86_64 s ...