【动规初步】合唱队形

 

合唱队形

时间限制:1秒 内存限制:256兆 231 次提交 87 次通过 
题目描述
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。 
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1, 2, …, K,他们的身高分别为T1, T2, …, TK,则他们的身高满足T1 < T2 < … < Ti , Ti > Ti+1 > … > TK (1 <= i <= K)。 
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
输入
输入的第一行是一个整数N(2 <= N <= 100),表示同学的总数。 
第一行有n个整数,用空格分隔,第i个整数Ti(130 <= Ti <= 230)是第i位同学的身高(厘米)。
输出
输出包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
样例输入
8
186 186 150 200 160 130 197 220
样例输出
4
#include<bits/stdc++.h>
using namespace std;
const int inf = -1;
int t[102],l[102],h[102];
int n;
int main()
{
    int i = 0,j;
    cin >> n;
    for(i = 0;i < n;i++)
    {
        cin >> t[i];
        l[i] = 1;
        h[i] = 1;
    }
    //上升 
    for(i = 0;i < n;i++)
        for(j = 0;j < i;j++)
        {
            if(t[i] > t[j] && h[j] + 1 > h[i])
            h[i] = h[j] + 1;
        }
    //下降
    for(i = n-1;i >= 0;i--)
        for(j = n-1; j > i;j--)
        {
            if(t[i] > t[j] && l[j] +1 > l[i])
            l[i] = l[j] + 1;
         } 
    int ans = inf;
    for(i = 0;i< n;i++)
    ans = max(ans,l[i] + h[i]);
    cout << n - ans + 1;
    return 0;
}

 

posted @ 2018-10-30 20:34  LizLiz  阅读(229)  评论(0)    收藏  举报