来源:http://poj.org/problem?id=1836
思路:本题可以转换为求一个最长的先递增后递减数列,或者递增数列,或者递减数列。可以先正向求一个递增序列,再逆向求一个递增序列,通过这两个序列求出第i个数的左右两边的最长递增数列长度的和,求n个数的长度和的最大值。
代码:
#include <stdio.h>
int n,f1[1001],f2[1001],max;
//f1,f2分别记录正向和逆向的最长递增数列的长度
float a[1001];
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%f",&a[i]);
}
f1[0]=1;
for(int i=1;i<n;i++)
{
max=1;
for(int j=0;j<i;j++)
if(a[j]<a[i]&&f1[j]+1>max)
max=f1[j]+1;
f1[i]=max;
}//求正向递增数列的长度
f2[n-1]=1;
for(int i=n-2;i>=0;i--)
{
max=1;
for(int j=i+1;j<n;j++)
if(a[j]<a[i]&&f2[j]+1>max)
max=f2[j]+1;
f2[i]=max;
}//求逆向递增数列的长度
max=1;
for(int i=0;i<n;i++)
{
if(f1[i]>max) max=f1[i];
f1[i]=max;
}//求第i个数左边的最长递增数列的长度
max=1;
for(int i=n-1;i>=0;i--)
{
if(f2[i]>max) max=f2[i];
f2[i]=max;
}//求第i个数右边的最长递增数列的长度
max=0;
for(int i=0;i<n-1;i++)
if(f1[i]+f2[i+1]>max)
max=f1[i]+f2[i+1];
printf("%d",n-max);
return 0;
}