poj1836
最长单调子序列,看清题意,从左边求上升,从右边求下降,然后相加,注意中间两个点的高度可以相同(练手)
#include <stdio.h>
#include <string.h>
#define max(a,b) ((a)>(b)?true:false)
double a[1001];
int l[1001],h[1001],s[1001];
int n;
int main()
{
while(scanf("%d",&n)==1)
{
memset(l,0,sizeof(l));
memset(h,0,sizeof(h));
for(int i=0;i<n;++i)
scanf("%lf",&a[i]);
for(int i=0;i<n;++i)
{
for(int j=0;j<i;++j)
if(a[j]<a[i]&&max(l[j],l[i]))
l[i]=l[j];
++l[i];
}
for(int i=n-1;i>=0;--i)
{
for(int j=n-1;j>i;--j)
if(a[j]<a[i]&&max(h[j],h[i]))
h[i]=h[j];
++h[i];
}
int max=0;
for(int i=0;i<n;++i)
{
s[i]=l[i]+h[i]-1;
for(int j=i+1;j<n;++j)
if(a[i]==a[j])
{
if(s[i]<(l[i]+h[j]))
s[i]=l[i]+h[j];
else
break;
}
if(max<s[i]) max=s[i];
}
printf("%d\n",n-max);
}
return 0;
}
浙公网安备 33010602011771号