寒假每日一题打卡day19——Acwing 482. 合唱队形

【题目描述】

在这里插入图片描述
【思路】
即找到一个k,使得k左边从k到1严格递减,右边从k到n也严格递减。实际上就是两个最长上升子序列问题。

Acwing 482. 合唱队形

import java.io.*;
import java.lang.Math;
public class Main{
    static int N = 110;
    public static void main(String args[]) throws Exception{
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter log = new BufferedWriter(new OutputStreamWriter(System.out));
        int n = Integer.parseInt(bf.readLine());
        int [] q =new int[n+ 1];
        int f[] = new int[n + 1];
        int g[]= new int[n + 1];
        String strArr[] = bf.readLine().split(" ");
        for(int i = 1; i <= n; i++) q[i] = Integer.parseInt(strArr[i - 1]);
        //T1<…<Ti>Ti+1>…>TK(1≤i≤K)。
        
        //f[i]为以i结尾的子序列最长长度
        for(int i = 1; i <= n; i++){
            f[i] = 1;
            for(int j =1; j < i; j++){
                if( q[i] > q[j]) f[i] = Math.max(f[j] + 1, f[i]);
            }
        }
        for(int i = n; i >= 1; i --){
            g[i] = 1;
            for(int j = n; j > i; j --)
                if(q[j] < q[i] ) g[i] =Math.max(g[j] + 1, g[i]);
        }
        int res = 0;
        //枚举每一个可能的i
        for(int i = 1; i <= n; i ++){
            //队列最多可以有多少个同学
            res =Math.max(res, f[i] + g[i] - 1);
        }
        //最少需要几位同学出列。
        System.out.println(n - res);
        
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值