思路:其实就是利用动态规划从左向右求一个最大长度递增的子序列,再从右向左求一个最大长度递增的子序列。这样合起来就是先增后减的了。
代码如下:
<pre name="code" class="java">import java.util.Arrays;
import java.util.Scanner;
public class HeChang {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String num = scan.nextLine();
int n = Integer.valueOf(num);
String str = scan.nextLine();
String[] ss =str.split(" ");
int len = ss.length;
int[] a = new int[ss.length];
for(int i=0;i<ss.length;i++){
a[i] = Integer.valueOf(ss[i]);
}
// 从左向右
int[] f1 = new int[len];
//从右向左
int[] f2 = new int[len];
for(int i=0;i<n;i++)//由左向右依次遍历
{
//f1[i] = 1;//至少有一个人符合条件,就是他自己。所以赋初值1.
for(int j=0;j<i;j++)
{
if(a[i]>a[j]&&f1[i]<f1[j]+1) //f1[i]<f1[j]+1很关键的条件,动态问题
f1[i]= f1[j]+1;
}
}
for(int i=n-1;i>=0;i--)//由右向左依次遍历
{
f2[i] = 1;//至少有一个人符合条件,就是他自己。所以赋初值1.
for (int j=n-1;j>i;j--)
{
if(a[i]>a[j]&&f2[i]<f2[j]+1)
f2[i]=f2[j]+1;
}
}
int ans = 0;
for(int i=0;i<n;i++)
if(ans<f1[i]+f2[i])
ans=f1[i]+f2[i];//最佳解
System.out.println(n-ans);
}
}