POJ 1836 Alignment

来源:互联网 发布:资源商城源码 编辑:程序博客网 时间:2024/06/09 20:41

题意分析:军队里站了一排人,要求你挑选几个人出列,使每个人都可以看见队列的左端或右端,问你最少几个人出列


输入样例分析:

81.86 1.86 1.30621 2 1.4 1 1.97 2.2

8 是这排人的人数

下面的8个浮点数是每个士兵的身高(浮点数)。


解题思路:分别从左端,右端开始找到以每个士兵结尾的最长子序列。

枚举每一对士兵左边士兵的左最长子序列和右边士兵的右最长子序列之和最大值就是最终这排人的数量,原这排人的数量减去最终这排人的数量就是结果。

求最长子序列可以参考我这篇文章:

http://blog.csdn.net/qq_38737992/article/details/77716831

#include <cstdio>#include <cstring>#include <iostream>using namespace std;int main(){ double s[1010]; // 存储士兵的身高  int  d[1010], d1[1000];  // d[] 左最长子序列   d1[]右最长子序列  int n, i, j;  scanf("%d",&n); // 原这排士兵的人数  for(i=1;i<=n;i++)  scanf("%lf",&s[i]);     memset(d,0,sizeof(d)); memset(d1,0,sizeof(d1)); //初始化       d[1] = 1, d1[n] = 1;      for(i=2;i<=n;i++)  // 左最长子序列   {    d[i] = 1;  for(j=1;j<i;j++)   {     if(s[i]>s[j])       d[i] = max(d[j]+1,d[i]); }      }          for(i=n-1;i>=1;i--) // 右最长子序列        {         d1[i] = 1;        for(j=n;j>i;j--)          if(s[i]>s[j])           d1[i] = max(d1[j]+1,d1[i]);  }      int res = 0;        for(i=1;i<n;i++)   // 枚举每一对士兵             for(j=i+1;j<=n;j++)              if(d[i]+d1[j]>res)                  res = d[i] + d1[j];                         printf("%d\n",n-res);return 0;}