joj2529

来源:互联网 发布:printk源码 编辑:程序博客网 时间:2024/05/21 15:48

 2529: Chorus


ResultTIME LimitMEMORY LimitRun TimesAC TimesJUDGE1s65536K551154Standard

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

Input

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

Output

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

Sample Input

8186 186 150 200 160 130 197 220

Sample Output

4

Problem Source: noip


This problem is used for contest: 122  148 


Submit / Problem List / Status / Discuss






#include<stdio.h>
#include<iostream>
using namespace std;
int a[100+10];
int b[100+10];
int c[100+10];
int n;
int main()
{
    //freopen("in.txt","r",stdin);
    while(scanf("%d",&n)==1)
    {
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        int p;
        int mm=-1;
        for(int t=1;t<=n;t++)
        {
            for(int i=1;i<=n;i++)
            {
                b[i]=c[i]=1;
            }
            p=t;
            for(int i=2;i<=p;i++)
            {
                for(int j=1;j<i;j++)
                {
                    if(a[i]>a[j]&&(b[i]<b[j]+1))
                    {
                        b[i]=b[j]+1;
                    }
                }
            }
            c[n]=1;
            for(int i=n-1;i>=p;i--)
            {
                for(int j=i+1;j<=n;j++)
                {
                    if(a[i]>a[j]&&(c[i]<c[j]+1))
                    {
                        c[i]=c[j]+1;
                    }
                }
            }
            int sum=c[p]+b[p]-1;
            if(sum>mm)
            mm=sum;
        }
        printf("%d\n",n-mm);
    }


    return 0;
}



这个是一个动态规划的题目,通过将i从1到n作为Ti+1遍历一遍搜索最小值。。

b[i]表示前i个中最多能有几个数满足从小到大。。

c[i]表示从i到n最多能满足几个数从大到小排列。。。


原创粉丝点击