zoukankan      html  css  js  c++  java
  • vijos1098 经典LIS变形

    合唱队形

    描述

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

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

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

    格式

    输入格式

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

    输出格式

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

    样例1

    样例输入1

    8
    186 186 150 200 160 130 197 220
    

    样例输出1

    4
    

    限制

    每个测试点1s

    来源

    NOIp 2004

    枚举中点两边暴力LIS

    #include<bits/stdc++.h>
    using namespace std;
    int dp[110];
    int a[110];
    int N;
    int solve(int mid)
    {
    memset(dp,0,sizeof(dp));
    int pre=0,las=0,i,j;
    for(i=1;i<=mid;++i){int tmp=0;
    for(j=1;j<i;++j)
    if(a[j]<a[i]) tmp=max(tmp,dp[j]);
    dp[i]=tmp+1;
    } pre=dp[mid]; dp[mid]=0;
    for(i=N;i>=mid;--i){int tmp=0;
    for(j=N;j>i;--j)
    if(a[j]<a[i]) tmp=max(tmp,dp[j]);
    dp[i]=tmp+1;
    }las=dp[mid];
    return pre+las-1;
    }
    int main()
    {
    int m,i,j,ans=0;
    cin>>N;
    for(i=1;i<=N;++i) cin>>a[i];
    for(i=1;i<=N;++i) ans=max(ans,solve(i));
    cout<<N-ans<<endl;
    return 0;
    }

  • 相关阅读:
    网页制作
    线性表
    学习进度表
    我是一只IT小小鸟读后感
    Git分支管理(一)
    家庭因你而不同
    Mysql循环insert数据
    IDEA,右边栏不显示maven解决方案
    Linux定时清理日志脚本
    JAVA的夸平台特性的优势——工厂在线生产信息采集项目
  • 原文地址:https://www.cnblogs.com/zzqc/p/6857070.html
Copyright © 2011-2022 走看看