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( ...
随机推荐
- C#集合 -- Equality和Order插件
在前面的文章C#相等性比较和C#排序比较中,我已经叙述了类型相等,类型哈希,和类型比较的.NET标准协议.实现了这些协议的类型在一个字典或者列表中也可以正常工作.但是需要注意的是: 只有当类型的Equ ...
- C# 接口的隐式与显示实现
隐式实现的话实现的方法属于实现的类的,可以直接通过类的对象访问,显式实现的话方法是属于接口的,可以看成是寄托在类中实现的,访问这些方法时要先把对象转换成接口对象,然后通过接口对象调用 一般来讲显式实现 ...
- 让Mac也能拥有apt-get类似的功能——Brew
之前一直怀念ubuntu下的apt-get,因为实在是方便,需要安装什么,一个命令搞定,相关的依赖包统统由apt-get维护.下载,编译,安装,那叫一个痛快.什么软件用着不爽,一个命令卸载! 怀念ap ...
- js 判断微信浏览器
上周接到个需求,需求是这样的:用户扫一扫二维码会产生一个链接,该链接会向后端发送个请求,返回一个 apk 的下载地址,用户点击下载按钮可以下载此 apk.然后就发生了问题,经过测试,发现用微信扫一扫打 ...
- 结合使用saiku、mondrian workbentch建立多维查询报表
1.简介 前几篇博客已经介绍了saiku.mondrian.MDX和模式文件他们之间的关系,那么如何将它们串联起来,供产品人员使用哪?下面咱们一步一步的实现 2.建立数据表 建表语句参考:http:/ ...
- iOS开发之时间格式的转化
在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理. 例如:如何将格式为“12-May-14 05.08.02.000000 PM” ...
- SQL Server 2008 R2 开启数据库远程连接
今天要测试一个.net系统~因为配置的数据库是SQL Server~我就不得不安装SQL Server 2008 R2~现在我们就一起来看看SQL Server 2008 R2是如何打开远程连接端口1 ...
- CCF推荐国际学术期刊
中国计算机学会推荐国际学术期刊 (计算机系统与高性能计算) 一.A类 序号 刊物简称 刊物全称 出版社 网址 1 TOCS ACM Transactions on Computer Systems A ...
- html中css三种常见的样式选择器 zz
1:标签选择器 标签选择器,是所有带有某种标签的都生效.这里以p为例,也就是所有的带有p标记的都会这样的样式 <html><head><styletype="t ...
- Log4net介绍
一.Log4net介绍 log4net是一个功能著名的开源日志记录组件.利用log4net可以方便地将日志信息记录到文件.控制台.Windows事件日志和数据库(包括MS Server,Access, ...