标签:des style blog io os ar for strong sp
| Time Limit: 1000MS | Memory Limit: 30000K | |
| Total Submissions: 13319 | Accepted: 4282 |
Description
Input
Output
Sample Input
8 1.86 1.86 1.30621 2 1.4 1 1.97 2.2
Sample Output
4
Source
题目要求:给出n个人排成一排,踢出一些人,让每个人都能看到最左端,或最后端,最小的踢出人数是?
计算出正序和倒序的最长上升子序列,然后统计:有两种可能,一种是其中一个人是中间,那个人的身高最高,还有事两个人的身高相同,这两个人位置在中间,统计出最长的可能出现的队伍长度,计算出最小的踢出人数
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int dp1[1200] , dp2[1200] ;
double h[1200] ;
int main()
{
int i , j , n , min1 ;
while(scanf("%d", &n)!=EOF)
{
min1 = 1200 ;
h[0] = 0 ; h[n+1] = 0 ;
for(i = 1 ; i <= n ; i++)
scanf("%lf", &h[i]);
memset(dp1,0,sizeof(dp1));
for(i = 1 ; i <= n ; i++)
{
for(j = 0 ; j < i ; j++)
if( h[j] < h[i] && dp1[j]+1 > dp1[i] )
dp1[i] = dp1[j]+1 ;
}
memset(dp2,0,sizeof(dp2));
for(i = n ; i >= 1 ; i--)
{
for(j = n+1 ; j > i ; j--)
if( h[j] < h[i] && dp2[j]+1 > dp2[i] )
dp2[i] = dp2[j]+1 ;
}
for(i = 1 ; i <= n ; i++)
{
for(j = i ; j <= n ; j++)
{
if(i == j)
min1 = min(min1,n-(dp1[i]+dp2[j]-1) );
else
min1 = min(min1, n-( dp1[i]+dp2[j] ) );
}
}
printf("%d\n", min1);
}
}
poj1836--Alignment(dp,最长上升子序列变形)
标签:des style blog io os ar for strong sp
原文地址:http://blog.csdn.net/winddreams/article/details/40150111