zoukankan      html  css  js  c++  java
  • 华为笔试题 合唱队

    题目描述

    计算最少出列多少位同学,使得剩下的同学排成合唱队形

    说明:

    N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。 
    合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK,   则他们的身高满足存在i(1<=i<=K)使得T1<T2<......<Ti-1<Ti>Ti+1>......>TK。 
    你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。 

    输入描述:

    整数N

    输出描述:

    最少需要几位同学出列

    输入例子:
    8
    186 186 150 200 160 130 197 200
    输出例子:
    4

    思路:第一种想法比较容易想到的是枚举处于中间位置的身高的值mid,然后根据mid所处的位置,对于0-mid-1部分求最大递增子序列,对mid+1~n求最大递减子序列。
    很明显的是复杂度为O(n^3),超时;
    优化的方法:容易了解到,只要求得第i个位置,从0~i的递增子序列,以及从i~n-1的递减子序列即可;so,我们可以求得从0~n-1依次递增子序列,然后倒着求递增子序列;分别求出每一个位置两者所得的子序列之和的最大值即可获得answer;
    这样时间复杂度为O(n^2);
    代码如下:

     1 #include<stdio.h>
     2 #include<iostream>
     3 #include<algorithm>
     4 using namespace std;
     5 #define maxn 10000
     6 
     7 int dp1[maxn] ,dp2[maxn], h[maxn] , ans;
     8 
     9 void solve(int n , int &ans){
    10 
    11     int max1 = 0;
    12     dp1[0] =1;
    13     for(int i = 1 ; i < n ; i ++){
    14        dp1[i] = 1;
    15        for(int j = i-1 ; j >= 0 ;j --)
    16         if(h[i] > h[j]){
    17             dp1[i] = max(dp1[i] , dp1[j] + 1);
    18         }
    19     }
    20     dp2[n-1] = 1;
    21     for(int i = n-2 ; i >= 0 ; i --){
    22        dp2[i] = 1;
    23        for(int j = i+1 ; j < n ;j ++)
    24         if(h[i] > h[j]){
    25             dp2[i] = max(dp2[i] , dp2[j] + 1);
    26         }
    27         max1 = max(max1 , dp1[i] + dp2[i]);
    28     }
    29     ans = max1 ;
    30 }
    31 
    32 int main(){
    33 
    34     int n;
    35     while(scanf("%d",&n) != EOF)
    36     {
    37         for(int i = 0 ; i < n ; i ++)
    38             scanf("%d",&h[i]);
    39 
    40         ans = 0;
    41 
    42         solve(n , ans);
    43         cout<<n - ans + 1<<endl;
    44     }
    45     return 0;
    46 }



  • 相关阅读:
    SuSE上运行MyCat(二):配置单点MyCat
    mysql笔记系列(七)唯一索引和普通索引的性能区别
    LINUX中LS对文件进行按大小排序和按时间排序,设置LS时间格式
    Linux下查看网关方法:
    linux
    Linux ip命令详解
    suse下设置IP的3种方法
    linux配置虚拟IP--VIP
    chroot的用法
    91家纺网,十次更新
  • 原文地址:https://www.cnblogs.com/castlehappiness/p/5844134.html
Copyright © 2011-2022 走看看