大致题意:给出一队士兵的身高,一开始不是按身高排序的。要求最少的人出列,使原序列的士兵的身高先递增后递减。

求递增和递减不难想到递增子序列,要求最少的人出列,也就是原队列的人要最多。

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)的变形的更多相关文章

  1. 动态规划(DP),最长递增子序列(LIS)

    题目链接:http://poj.org/problem?id=2533 解题报告: 状态转移方程: dp[i]表示以a[i]为结尾的LIS长度 状态转移方程: dp[0]=1; dp[i]=max(d ...

  2. 2.16 最长递增子序列 LIS

    [本文链接] http://www.cnblogs.com/hellogiser/p/dp-of-LIS.html [分析] 思路一:设序列为A,对序列进行排序后得到B,那么A的最长递增子序列LIS就 ...

  3. 最长回文子序列LCS,最长递增子序列LIS及相互联系

    最长公共子序列LCS Lintcode 77. 最长公共子序列 LCS问题是求两个字符串的最长公共子序列 \[ dp[i][j] = \left\{\begin{matrix} & max(d ...

  4. 一个数组求其最长递增子序列(LIS)

    一个数组求其最长递增子序列(LIS) 例如数组{3, 1, 4, 2, 3, 9, 4, 6}的LIS是{1, 2, 3, 4, 6},长度为5,假设数组长度为N,求数组的LIS的长度, 需要一个额外 ...

  5. 算法面试题 之 最长递增子序列 LIS

    找出最长递增序列 O(NlogN)(不一定连续!) 参考 http://www.felix021.com/blog/read.php?1587%E5%8F%AF%E6%98%AF%E8%BF%9E%E ...

  6. 算法之动态规划(最长递增子序列——LIS)

    最长递增子序列是动态规划中最经典的问题之一,我们从讨论这个问题开始,循序渐进的了解动态规划的相关知识要点. 在一个已知的序列 {a1, a 2,...an}中,取出若干数组成新的序列{ai1, ai ...

  7. 最长递增子序列 LIS 时间复杂度O(nlogn)的Java实现

    关于最长递增子序列时间复杂度O(n^2)的实现方法在博客http://blog.csdn.net/iniegang/article/details/47379873(最长递增子序列 Java实现)中已 ...

  8. 动态规划 - 最长递增子序列(LIS)

    最长递增子序列是动态规划中经典的问题,详细如下: 在一个已知的序列{a1,a2,...,an}中,取出若干数组组成新的序列{ai1,ai2,...,aim},其中下标i1,i2,...,im保持递增, ...

  9. 最长递增子序列LIS再谈

    DP模型: d(i) 以第 i 个元素结尾的最长递增子序列的长度. 那么就有 d(i) = max(d(j)) + 1;(j<i&&a[j]<a[i]),答案 max(d( ...

随机推荐

  1. ValidationExpression="http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?" can not work

    ValidationExpression="http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?" can not work &quo ...

  2. __declspec(dllimport)

    我相信写WIN32程序的人,做过DLL,都会很清楚__declspec(dllexport)的作用,它就是为了省掉在DEF文件中手工定义导出哪些函数的一个方法.当然,如果你的DLL里全是C++的类的话 ...

  3. Http 1.1协议

    HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间数据交换的过程. 1.Http1. ...

  4. react-native Unrecognized font family ‘Lonicons’;

    在使用:react-native-vector-icons库时报的错. 解决办法:使用这个库时android和ios工程目录中需要做些配置 配制方法如下: http://www.cnblogs.com ...

  5. 【转】BUFFER CACHE WAIT EVENTS

    文章转自:http://oracleinaction.com/buffer-cache-wait-events/

  6. C#基础总结之五Dictionary<string, string[]>和while循环

    #region 第五天作业 名片集(01) //Dictionary<string, string[]> PersonCard = new Dictionary<string, st ...

  7. 在server 2008/2003中 取消对网站的安全检查/去除添加信任网站

    新安装好Windows   Server   2003操作系统后,打开浏览器来查询网上信息时,发现IE总是“不厌其烦”地提示我们,是否需要将当前访问的网站添加到自己信任的站点中去:要是不信任的话,就无 ...

  8. css的两种引用方式 link和@import

    学习web开发的最大乐趣就是不断的发现自己以前不曾见过的东西,这些东西对于我来说是那么的新鲜有趣. 比如说今天偶尔研究别人的网站,就发现了有趣的东东. 当点开此网页的css时(这个css文件命名方式就 ...

  9. 【目录】C#操作Excel组件Spire.XLS系列文章目录

    本博客所有文章分类的总目录链接:http://www.cnblogs.com/asxinyu/p/4288836.html 1.C#操作Excel组件Spire.XLS文章目录 1.[原创].NET读 ...

  10. weblogic集群中获取jndi的方式

    # The following example specifies a list of WebLogic Servers using the same port: ht.put(Context.PRO ...