合唱队列

洛谷1091 合唱队列

觉得自己就是个ZZ,打眼一看,没思路,一看数据,n<=100,这不会是大法师吧。。。于是打暴力,快一小时(加上30分钟下课~~哦,下课时和陈国凯聊了一会QQ,%%%学神,mac啊)也没调出来,信心倍搓,然后放弃,看题解,哦cao,是最长上升子序列,然后秒掉了。。。。。。。。。

先正着做一遍LIS,再倒着来一遍LIS,再枚举中间最高的人,正反求和,取最大,最后用n减去ans再减一,因为最高的人被算了两次。

#include<bits/stdc++.h>
using namespace std;
int n;
int a[101];
int fr[101],ba[101];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    cin>>a[i];

    for(int i=1;i<=n;i++)
      for(int j=1;j<i;j++)
        {
            if(a[i]>a[j])
            fr[i]=max(fr[i],fr[j]+1);
        }

    for(int i=n;i>=1;i--)
      for(int j=n;j>i;j--)
        {
            if(a[i]>a[j])
            ba[i]=max(ba[i],ba[j]+1);
        }
        int ans=-1;
    for(int i=1;i<=n;i++)
    {
        ans=max(fr[i]+ba[i],ans);
    }
    cout<<n-ans-1;
    return 0;
}
时间: 2024-12-16 16:41:49

合唱队列的相关文章

[P1091]合唱队列 - 动态规划

洛谷P1091 题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2-,K,他们的身高分别为T1,T2,-,TK, 则他们的身高满足T1<... 输入格式: 输入文件chorus.in的第一行是一个整数N(2<=N<=100),表示同学的总数.第一行有n个整数,用空格分隔,第i个整数Ti(130<=Ti<=230)是第i位同学的身高(厘米). 输出格式: 输出文件c

合唱队形 九度1131 RONOJ26

#include<stdio.h>#include<stdlib.h>int main(){ int students,max=0; int i,j; int a[100],b[100],c[100]; scanf("%d",&students); for(i=0;i<students;i++) scanf("%d",&a[i]); for(i=0;i<students;i++) //寻找从左边开始的最长上升子序列

动态规划之线性动归

线性规划是一类问题.目标函数为特定变量的线性函数,约束是这些变量的线性不等式(standard form)或等式(slack form),目的是求目标函数的最大值或最小值.这类动态规划是平时比较常见的一类动态规划问题. 一.钢条切割问题: 假设公司出售一段长度为i英寸的钢条的价格为Pi(i = 1, 2, -单位:美元),下面给出了价格表样例: 长度i  1  2  3  4  5 6 7 8 9 10 价格Pi  1 5 8 9 10 17 17 20 24 30 切割钢条的问题是这样的:给定

合唱队形(动态规划)

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

P1091 合唱队形(LIS)

题目描述 NNN位同学站成一排,音乐老师要请其中的(N−KN-KN−K)位同学出列,使得剩下的KKK位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2,…,K1,2,…,K1,2,…,K,他们的身高分别为T1,T2,…,TKT_1,T_2,…,T_KT1?,T2?,…,TK?, 则他们的身高满足T1<...<Ti>Ti+1>…>TK(1≤i≤K)T_1<...<T_i>T_{i+1}>…>T_K(1 \le i

redis 学习 四 队列

<?php /** * redis实战 * * 利用列表list实现简单队列 * * @example php cache.php */ header('content-type:text/html;chaeset=utf-8'); $redis = new \Redis(); $redis->connect('127.0.0.1', 6379); // 进队列 $userId = mt_rand(000000, 999999); $redis->rpush('QUEUE_NAME',j

构建队列,数组版本

队列作为基本的数据结构,是每个coder所必须掌握的. 队列在逻辑上就像是一条打饭的长队,排在前面的先打到饭(先进先出). 这里用一个数组用以构造一个队列,并设置两个指向,head指向队首,tail指向队尾,初始状态是head与tail指向同一位置(队列为空) 队列有两个操作:入队与出队. 1.入队:对比打饭排队的场景,新来的人排在后面,这是队尾tail需向后移一位. 2.出队:已经打好饭的人就可以出去了,这时队头也需向后移一位,让后面的人成为队头. 注意: 当head与tail都移到数组末端,

链队列代码及应用

链队列代码 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <time.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define TRUE 1 #define FALSE 0 typedef int Status; typedef int ElemType; typedef struct Qnode{ int

caffe数据读取的双阻塞队列说明

caffe的datareader类中 class QueuePair { public: explicit QueuePair(int size); ~QueuePair(); BlockingQueue<T*> free_; BlockingQueue<T*> full_; DISABLE_COPY_AND_ASSIGN(QueuePair); }; 这个就是双阻塞队列,先将free队列填充到最大长度,然后按照如下规则: 1,每当生产者push时,先将full队列pop,如果fu