首页 > 代码库 > poj 1836 Alignment 排队
poj 1836 Alignment 排队
poj 1836 Alignment
http://poj.org/problem?id=1836
题意:有士兵n个,根据编号排为一列,但是身高不一,现在要求去掉几个人,使得剩下的每一个人可以向左或向右看到队头。问:至少去掉的士兵数。
dp动态规划 之 双向LIS问题
1 /* 2 Problem: 1836 User: bibier 3 Memory: 712K Time: 63MS 4 Language: G++ Result: Accepted 5 */ 6 //动态规划 之 双向LIS问题 7 #include <stdio.h> 8 #include <string.h> 9 #include <iostream>10 #include <algorithm>11 #include <cstdio>12 #include <cstring>13 #include <cmath>14 #include <stack>15 #include <queue>16 #include <vector>17 using namespace std;18 #define M 0x0f0f0f0f19 #define min(a,b) (a>b?b:a)20 #define max(a,b) (a>b?a:b)21 22 int qdp[1003];23 int hdp[1003];24 float high[1003];25 26 int main()27 {28 int n;29 int i,j;30 scanf("%d",&n);31 for(i=0; i<n; i++)32 {33 scanf("%f",&high[i]);34 qdp[i]=1;35 hdp[i]=1;36 }37 38 for(i=1; i<n; i++)39 for(j=0; j<i; j++)40 {41 if(high[j]<high[i]&&qdp[j]==qdp[i])42 qdp[i]++;43 }44 45 for(i=n-2; i>=0; i--)46 for(j=n-1; j>i; j--)47 {48 if(high[j]<high[i]&&hdp[j]==hdp[i])49 hdp[i]++;50 }51 52 int max_=0;53 54 /*55 若没有身高相同的一层循环就足够56 for(i=0; i<n; i++)57 max_=max(max_,qdp[i]+hdp[i]);58 */59 60 for(i=0; i<n-1; i++) //用两层循环是为了处理1 2 5 5 1 3 2或1 2 5 5 5 5 1 3 261 for(j=i+1; j<n; j++)62 max_=max(max_,qdp[i]+hdp[j]);63 printf("%d\n",n-max_);64 return 0;65 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。