POJ 1836 Alignment 最长递增子序列(LIS)的变形
大致题意:给出一队士兵的身高,一开始不是按身高排序的。要求最少的人出列,使原序列的士兵的身高先递增后递减。
求递增和递减不难想到递增子序列,要求最少的人出列,也就是原队列的人要最多。
1 2 3 4 5 4 3 2 1
这个序列从左至右看前半部分是递增,从右至左看前半部分也是递增。所以我们先把从左只右和从右至左的LIS分别求出来。
如果结果是这样的:
A[i]={1.86 1.86 1.30621 2 1.4 1 1.97 2.2} //原队列
a[i]={1 1 1 2 2 1 3 4}
b[i]={3 3 2 3 2 1 1 1}
如果是A[1]~A[i]递增,A[i+1]~A[8]递减。此时就是求:a[1]~a[i]之间的一个值与b[i+1]~b[8]之间的一个值的和的最大值。
O(n^2)和O(nlogn)算法都可以过。
O(n^2)算法:
#include <iostream>
#include <cstdio>
using namespace std; const int Max=1e3+; int main()
{
//freopen("in.txt","r",stdin);
int n;
scanf("%d",&n);
double a[Max]={};
for(int i=; i<n; i++)
scanf("%f",a+i);
int l[Max]= {},r[Max]= {};
l[]=r[n-]=;
for(int i = ; i < n; i++)
{
int maxLen = ;
for(int j = ; j < i; j++)
if(a[j]<a[i])
maxLen = max(maxLen,l[j]);
l[i] = maxLen + ;
}
for(int i=n-; i>=; i--)
{
int maxLen=;
for(int j=n-; j>i; j--)
if(a[j]<a[i])
maxLen=max(maxLen,r[j]);
r[i]=maxLen+;
}
int maxlen=;
for(int i=;i<n-;i++)
for(int j=i+;j<n;j++)
maxlen=max(maxlen,l[i]+r[j]);
printf("%d\n",n-maxlen);
return ;
}
O(nlogn)算法
#include <iostream>
#include <cstdio>
using namespace std; const int Max=1e3+;
int l[Max]= {},r[Max]= {};
double B[Max];
int BinarySearch(double *a, double value, int n)
{
int low = ;
int high = n - ;
while(low <= high)
{
int mid = (high + low) / ;
if(a[mid] == value)
return mid;
else if(value<a[mid])
high = mid - ;
else
low = mid + ;
}
return low;
}
int LIS_DP_NlogN(double *a, int n,int *Len)
{
int nLISLen = ;
B[] = a[];
for(int i = ; i < n; i++)
{
if(a[i] > B[nLISLen - ])
{
B[nLISLen] = a[i];
nLISLen++;
Len[i]=nLISLen;
}
else
{
int pos = BinarySearch(B, a[i], nLISLen);
B[pos] = a[i];
Len[i]=pos+;
}
}
return nLISLen;
}
int main()
{
//freopen("in.txt","r",stdin);
int n;
scanf("%d",&n);
double a[Max]={};
double b[Max]={};
l[]=r[]=;
for(int i=; i<n; i++)
{
scanf("%f",a+i);
b[n-i-]=a[i];
}
LIS_DP_NlogN(a,n,l);
LIS_DP_NlogN(b,n,r);
int maxlen=;
for(int i=;i<n-;i++)
for(int j=n-i-;j>=;j--)
maxlen=max(maxlen,l[i]+r[j]);
printf("%d\n",n-maxlen);
return ;
}
POJ 1836 Alignment 最长递增子序列(LIS)的变形的更多相关文章
- 动态规划(DP),最长递增子序列(LIS)
题目链接:http://poj.org/problem?id=2533 解题报告: 状态转移方程: dp[i]表示以a[i]为结尾的LIS长度 状态转移方程: dp[0]=1; dp[i]=max(d ...
- 2.16 最长递增子序列 LIS
[本文链接] http://www.cnblogs.com/hellogiser/p/dp-of-LIS.html [分析] 思路一:设序列为A,对序列进行排序后得到B,那么A的最长递增子序列LIS就 ...
- 最长回文子序列LCS,最长递增子序列LIS及相互联系
最长公共子序列LCS Lintcode 77. 最长公共子序列 LCS问题是求两个字符串的最长公共子序列 \[ dp[i][j] = \left\{\begin{matrix} & max(d ...
- 一个数组求其最长递增子序列(LIS)
一个数组求其最长递增子序列(LIS) 例如数组{3, 1, 4, 2, 3, 9, 4, 6}的LIS是{1, 2, 3, 4, 6},长度为5,假设数组长度为N,求数组的LIS的长度, 需要一个额外 ...
- 算法面试题 之 最长递增子序列 LIS
找出最长递增序列 O(NlogN)(不一定连续!) 参考 http://www.felix021.com/blog/read.php?1587%E5%8F%AF%E6%98%AF%E8%BF%9E%E ...
- 算法之动态规划(最长递增子序列——LIS)
最长递增子序列是动态规划中最经典的问题之一,我们从讨论这个问题开始,循序渐进的了解动态规划的相关知识要点. 在一个已知的序列 {a1, a 2,...an}中,取出若干数组成新的序列{ai1, ai ...
- 最长递增子序列 LIS 时间复杂度O(nlogn)的Java实现
关于最长递增子序列时间复杂度O(n^2)的实现方法在博客http://blog.csdn.net/iniegang/article/details/47379873(最长递增子序列 Java实现)中已 ...
- 动态规划 - 最长递增子序列(LIS)
最长递增子序列是动态规划中经典的问题,详细如下: 在一个已知的序列{a1,a2,...,an}中,取出若干数组组成新的序列{ai1,ai2,...,aim},其中下标i1,i2,...,im保持递增, ...
- 最长递增子序列LIS再谈
DP模型: d(i) 以第 i 个元素结尾的最长递增子序列的长度. 那么就有 d(i) = max(d(j)) + 1;(j<i&&a[j]<a[i]),答案 max(d( ...
随机推荐
- php 生成 Json
php 生成 Json 部分 <?php $arr_result = array(); //返回值 $arr_result['result'] = '0'; $arr_result['calle ...
- 循环a数组(值代表b的下标)删除b数组中存在的记录,从后往前删
for (var j = adelete.Count-1; j >= 0; --j) { aAttachm ...
- 聊聊并发(七)——Java中的阻塞队列
3. 阻塞队列的实现原理 聊聊并发(七)--Java中的阻塞队列 作者 方腾飞 发布于 2013年12月18日 | ArchSummit全球架构师峰会(北京站)2016年12月02-03日举办,了解更 ...
- mac 进程管理
1.前言 启用goagent.firefly等服务的时候,如果非正常退出,再次启动经常会遇到address already in use,端口被先前启动的服务进程所占用,导致服务无法使用.这种情况,可 ...
- ubuntu关闭自动更新、打开 ubuntu 的 apport 崩溃检测报告功能
菜单栏点 系统 --->首选项 --->启动应用程序 --->更新提示 前面的钩打掉 关闭即可 =========== 打开 ubuntu 的 apport 崩溃检测报告功能 ...
- html中css三种常见的样式选择器 zz
1:标签选择器 标签选择器,是所有带有某种标签的都生效.这里以p为例,也就是所有的带有p标记的都会这样的样式 <html><head><styletype="t ...
- Making Your ActionBar Not Boring
这篇文章转自国外一个技术大牛的博客,首先感谢这位大牛的无私奉献. Android应用中有一名位 Google书报摊的应用,他实现了一种新的ActionBar风格.当用户初始进入该界面的时候,为一个透明 ...
- eclipse 手动/自动安装插件
只要你的Eclipse的压缩包,一般为xxx.zip,其内部包含了对应的features和plugins文件夹,(不管是否还有content.jar和artifacts.jar)则都可以: 要么手动解 ...
- 浅析Objective-C的copy
一直对NSObject的copy方法似懂非懂,今天工作做完了,整理一下 深复制和浅复制是什么在这里就不赘述 今天主要分三种类型对copy进行探讨:系统非容器类对象.系统容器类对象和自定义对象 系统非容 ...
- 【JVM学习笔记一】JVM内存分布
Overview 学习JVM首先需要了解一下JVM管理的内存是如何分布的,在看了<深入理解Java虚拟机>和一些博文之后,我准备自己记录一下学习的过程. 下图是JVM中运行时数据区的大致示 ...