合唱队----动态规划(求解最大递增/减子序列)


<p>N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合唱队形。  

合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1, 2, …, K,他们的身高分别为T1, T2, …, TK,则他们的身高满足T1 < T2 < … < Ti , Ti > Ti+1 > … > TK (1 <= i <= K) 。  

你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
</p><p>输入:

</p><p>第一行整数 N,表示同学的总数  

第二行整数数组,空格隔开,表示 N 位同学身高</p>
<p>输出:
</p><p>最少需要几位同学出列
</p><p>样例输入:
</p><p>8 

186 186 150 200 160 130 197 200</p><p>例输出:</p>
4

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n;
        n = scanner.nextInt();
        int height[] = new int[n];
        //input height
        for(int i = 0; i < n; i++){
            height[i] = scanner.nextInt();
        }//for
        
        int result = getResult(height);
        System.out.println(result);
        
            
        
        scanner.close();
    }
    
    private static int getResult(int array[]){
        int maxLengthArray[] = new int[array.length];
        for(int i = 0; i < maxLengthArray.length; i++)
            maxLengthArray[i] = 1;
        //update increase
        for(int i = 1; i < array.length; i++){
            for(int j = 0; j < i; j++){
                if(array[i] > array[j] && maxLengthArray[i] < maxLengthArray[j] + 1)
                    maxLengthArray[i] = maxLengthArray[j] + 1;
            }
        }//for
        
        int minLengthArray[] = new int[array.length];
        for(int i = 0; i < minLengthArray.length; i++)
            minLengthArray[i] = 1;
        //update decrease
        for(int i = array.length - 2; i >= 0; i--){
            for(int j = array.length - 1; j > i; j--){
                if(array[i] > array[j] && minLengthArray[i] < minLengthArray[j] + 1)
                    minLengthArray[i] = minLengthArray[j] + 1;
            }
        }//for
        
        //find max
        int maxLength = 0;
        for(int i = 0; i < maxLengthArray.length; i++)
            maxLength = maxLength > (maxLengthArray[i] + minLengthArray[i] - 1)? maxLength : (maxLengthArray[i] + minLengthArray[i] - 1);
            
        return array.length - maxLength;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值