Vijos:P1098合唱队形
描述
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位同学的身高(厘米)。
输出格式
输出包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
input:
8
186 186 150 200 160 130 197 220
output:
4
思路:LIS
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN=;
int n;
int h[MAXN];
int dp[MAXN];
int main()
{
cin>>n;
for(int i=;i<n;i++)
cin>>h[i];
int res=;
for(int k=;k<n;k++)
{
memset(dp,,sizeof(dp));
int mx1=,mx2=;
for(int i=;i<=k;i++)
{
dp[i]=;
for(int j=;j<i;j++)
{
if(h[i]>h[j])
{
dp[i]=max(dp[i],dp[j]+);
}
}
mx1=max(dp[i],mx1);
}
for(int i=k+;i<n;i++)
{
dp[i]=;
for(int j=k+;j<i;j++)
{
if(h[i]<h[j])
{
dp[i]=max(dp[i],dp[j]+);
}
}
mx2=max(mx2,dp[i]);
}
res=max(mx1+mx2,res);
}
cout<<n-res<<endl;
return ;
}
优化后
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN=;
int n;
int h[MAXN];
int dp[][MAXN];
int main()
{
cin>>n;
for(int i=;i<n;i++)
cin>>h[i];
int res=;
memset(dp,,sizeof(dp));
for(int i=;i<n;i++)
{
dp[][i]=;
for(int j=;j<i;j++)
{
if(h[i]>h[j])
{
dp[][i]=max(dp[][i],dp[][j]+);
}
}
}
for(int i=n-;i>=;i--)
{
dp[][i]=;
for(int j=n-;j>=i;j--)
{
if(h[i]>h[j])
{
dp[][i]=max(dp[][i],dp[][j]+);
}
}
}
for(int k=;k<n;k++)
{
int mx1=,mx2=;
for(int i=;i<=k;i++)
mx1=max(mx1,dp[][i]);
for(int i=n-;i>k;i--)
mx2=max(mx2,dp[][i]);
res=max(res,mx1+mx2);
}
cout<<n-res<<endl;
return ;
}
Vijos:P1098合唱队形的更多相关文章
- vijos 1098 合唱队形 - 动态规划
描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…, ...
- 合唱队形2(洛谷U5874)
题目背景 上次老师挑出来的(N-K)位同学很不高兴,于是他们准备自己组建合唱队形.他们请了kkk来帮忙. 题目描述 他们安排了一个动作--手拉着手唱一首歌(就是他们围成一个圈).如果有两个相邻的同学的 ...
- 合唱队形2 洛谷U5874
题目背景 上次老师挑出来的(N-K)位同学很不高兴,于是他们准备自己组建合唱队形.他们请了kkk来帮忙. 题目描述 他们安排了一个动作——手拉着手唱一首歌(就是他们围成一个圈).如果有两个相邻的同学的 ...
- TYVJ P1067 合唱队形 Label:上升子序列?
背景 NOIP2004 提高组 第三道 描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号 ...
- NOIP200407合唱队形+最长上升子序列O(n^2)详解
合唱队形解题报告 2016-05-12 4:30——6:45 NOIP200407合唱队形 难度级别:A: 运行时间限制:1000ms: 运行空间限制:256000KB: 代码长度限制:20000 ...
- 九度OJ 1131 合唱队形 -- 动态规划(最长递增子序列)
题目地址:http://ac.jobdu.com/problem.php?pid=1131 题目描述: N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合 ...
- 【dp】合唱队形
题目描述 NN位同学站成一排,音乐老师要请其中的(N-KN−K)位同学出列,使得剩下的KK位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2,…,K,他们的身高分别为 ...
- 洛谷 P1091 合唱队形
\[传送门在这里呀\] 题目描述 \(N\)位同学站成一排,音乐老师要请其中的\((N-K)\)位同学出列,使得剩下的\(K\)位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次 ...
- 洛谷p1091合唱队形题解
题目 合唱队形首先要满足的是从1这个位置到中间任意的位置为单增的,从中间任意的位置到最后是单减的,且长度最长.这样才能满足出列的同学最少. 如果要满足这个条件那么我们可以先预处理出每个点的从前找的最长 ...
随机推荐
- 选股公式blog+节选
<大智慧软件选股_大智慧软件如何选股>——一般性操作 http://jingyan.baidu.com/article/fa4125acb2028d28ac70923e.html < ...
- Android SDK上手指南 2:用户界面设计
http://mobile.51cto.com/ahot-419184.htm 内容简介 我们将为应用程序项目添加布局方案,在这方面XML与Eclipse ADT接口将成为工作中的得力助手——不过在后 ...
- 培训笔记——Linux目录说明
一般我们的电脑里都只有一块硬盘,但是这块硬盘怎么使用呢? 我们的头脑里大体有个分区的概念,为什么要分区呢? 不是很清楚,不过有句话说 不要把鸡蛋放在同一个篮子里,可能有这种考虑吧. 好,最起码知道分区 ...
- 深入理解利用new创建对象的执行过程以Person p=new Person("张三",20);为例
代码如下: class Person { private String name="haha"; private int age; private static String co ...
- poj3301 Texas Trip【三分算法】
题目地址:http://poj.org/problem?id=3301 简述:T组测试数据,每组线输入n,代表有n个点,接下来输入这n个点的坐标,坐标都是整数. 要求用一个最小的正方形覆盖所有的点,输 ...
- 算法(Algorithms)第4版 练习 1.5.4
代码实现: package com.qiusongde; import edu.princeton.cs.algs4.StdIn; import edu.princeton.cs.algs4.StdO ...
- Linux- 自动备份MySQL数据库脚本
数据安全很重要,所以日常中需要对数据库进行备份.
- 分享知识-快乐自己:Struts2 前台日期到后台的日期格式转换
案例目录: 关键代码展示: DateConverter: package com.mlq.util; import com.opensymphony.xwork2.conversion.TypeCon ...
- Django-01
知识预览 Django基本命令 二 路由配置系统(URLconf) 三 编写视图 四 Template 五 数据库与ORM admin的配置 一 什么是web框架? 框架,即framework,特指为 ...
- cin.get(),cin.getline(),getline(),gets(),getchar()
1.cin.get() (1).cin.get()-------提取单个字符,可以提取回车.空格 a=cin.get(); (2) 同(1)---------------提取单个字符,可以提取回车.空 ...