合唱队形(动态规划)

Description

N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。

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

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

Input

输入的第一行是一个整数N(2 <= N <= 100),表示同学的总数。第一行有n个整数,用空格分隔,第i个整数Ti(130 <= Ti <= 230)是第i位同学的身高(厘米)。

Output

输出包括一行,这一行只包含一个整数,就是最少需要几位同学出列。

Sample Input

8

186 186 150 200 160 130 197 220

Sample Output

4

解题思路:

选中队列中的一个学生,以该学生为核心,分别求出其左侧的最长递增子序列和其右侧的最长递减子序列,两者相加减去1就是以该同学为中心的合唱队的人数,所以我们只需要把每个学生都作为中心遍历一遍,就能得出人数最多的合唱队形,再把总人数减去合唱人数就是需要剔除的人数。

AC代码:

#include <iostream>
#include <cstdio>
#define MAX_NUM 105
using namespace std;

int main()
{
    int high[MAX_NUM], left[MAX_NUM], right[MAX_NUM], n;
    scanf("%d", &n);
    for(int i = 0; i < n; i++)
        scanf("%d", &high[i]);
    for(int i = 0; i < n; i++)
    {
        left[i] = 1;
        for(int j = 0;j < i; j++)
        {
            if(high[j] <high[i] && left[j] > left[i] - 1)   // 找出左边最长递增子序列
                left[i] = left[j] + 1;
        }
    }
    for(int i = n-1; i >= 0; i--)
    {
        right[i] = 1;
        for(int j = n-1;j > i; j--)
        {
            if(high[j] < high[i] && right[j] > right[i] - 1)  // 找出右边最长递减子序列
                right[i] = right[j] + 1;
        }
    }
    int max = 0;
    for(int i = 0; i < n; i++)
    {
        if(max < left[i] + right[i] - 1)
            max = left[i] + right[i] - 1;  // 寻找最多合唱人数
    }
    printf("%d\n",n - max);
    return 0;
}

合唱队形(动态规划),布布扣,bubuko.com

时间: 2024-10-26 11:35:58

合唱队形(动态规划)的相关文章

拦截导弹;合唱队形;友好城市——基本的单调序列动态规划吧

合集,三个题目基本上都一样.耗时也不贴了. 拦截导弹: 1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 const int N=128; 5 int n=1,val[N]; 6 int up[N],dn[N],cnt1,cnt2; 7 int main(){ 8 for(int i=0;i<N;i++)up[i]=dn[i]=1; 9 while(cin>>val[n])n++;n-

【模板】LIS模板 洛谷P1091 [NOIP2004提高组]合唱队形 [2017年4月计划 动态规划11]

以题写模板. 写了两个:n^2版本与nlogn版本 P1091 合唱队形 题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足T1<...<Ti>Ti+1>…>TK(1<=i<=K). 你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形. 输入输出格

动态规划---合唱队形(LIS问题)

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

1091 合唱队形

难度:普及/提高- 题目类型:动规 提交次数:1 涉及知识:线性动规 题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足T1<...<Ti>Ti+1>…>TK(1<=i<=K). 你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形. 输入输出格式

[华为]DP合唱队形

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

NOIP200407合唱队形+最长上升子序列O(n^2)详解

合唱队形解题报告 2016-05-12   4:30——6:45 NOIP200407合唱队形 难度级别:A: 运行时间限制:1000ms: 运行空间限制:256000KB: 代码长度限制:2000000B 试题描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形.     合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK,则他们的身高满足T1<...<Ti>Ti+1>…>TK

合唱队形

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

合唱队形2(洛谷U5874)

题目背景 上次老师挑出来的(N-K)位同学很不高兴,于是他们准备自己组建合唱队形.他们请了kkk来帮忙. 题目描述 他们安排了一个动作--手拉着手唱一首歌(就是他们围成一个圈).如果有两个相邻的同学的身高差非常大(比如姚明和一个1.5米高的人站在一起)的话,评委会感觉非常不爽.于是kkk需要帮助他们求出一种排队方案,使他们身高差距最大值最小,并输出这个最小值和这个方案. 输入输出格式 输入格式: 第一行一个整数N表示有N个人(排成一个圈) 第二行N个整数表示每个人的身高 输出格式: 第一行一个整

[NOIP2004] 提高组 洛谷P1091 合唱队形

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