动态规划
分别求出每个位置元素的左边最长递增序列和右边最长递减序列,求和之后取最大,就是符合的合唱队形,用总人数减去合理的人数就是所求结果。
import java.util.*; public class Main{ public static void main(String []args){ Scanner input=new Scanner(System.in); int n=input.nextInt(); int []num=new int[n]; for(int i=0;i<n;i++){ num[i]=input.nextInt(); } int maxLen=0; for(int i=0;i<n;i++){ int []dp=new int[i+1]; Arrays.fill(dp,1); for(int j=1;j<=i;j++){ //找到左边最长递增 for(int k=j+1;k<=i;k++){ if(num[k]>num[j]){ dp[k]=Math.max(dp[k],dp[j]+1); } } } int left=dp[i]; dp=new int[n]; Arrays.fill(dp,1); for(int j=i;j<n;j++){ //找到右边最长递减 for(int k=j+1;k<n;k++){ if(num[k]<num[j]){ dp[k]=Math.max(dp[k],dp[j]+1); } } } int right=dp[n-1]; maxLen=Math.max(maxLen,left+right-1); } System.out.println(n-maxLen); } }