1.合唱队形

2024-02-15 11:04
文章标签 合唱队

本文主要是介绍1.合唱队形,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Problem: 1.合唱队形

文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code

思路

这是一个动态规划问题。我们可以通过两次动态规划来解决这个问题。首先,我们从左到右进行动态规划,计算出每个位置的最长递增子序列长度。然后,我们从右到左进行动态规划,计算出每个位置的最长递减子序列长度。最后,我们遍历每个位置,找出最长递增子序列长度和最长递减子序列长度之和最大的位置,这个位置就是合唱队形的中心位置。然后,我们计算出需要出列的同学数量,即总人数减去最长递增子序列长度和最长递减子序列长度之和再加一。

解题方法

1、初始化两个数组,一个用来存储从左到右的最长递增子序列长度,一个用来存储从右到左的最长递减子序列长度。
2、从左到右进行动态规划,计算出每个位置的最长递增子序列长度。
3、从右到左进行动态规划,计算出每个位置的最长递减子序列长度。
4、遍历每个位置,找出最长递增子序列长度和最长递减子序列长度之和最大的位置。
5、计算出需要出列的同学数量,即总人数减去最长递增子序列长度和最长递减子序列长度之和再加一。

复杂度

时间复杂度:

这个算法的时间复杂度是 O ( n 2 ) O(n^2) O(n2),因为我们需要进行两次动态规划,每次动态规划的时间复杂度都是 O ( n 2 ) O(n^2) O(n2)

空间复杂度:

这个算法的空间复杂度是 O ( n ) O(n) O(n),因为我们需要存储两个长度为n的数组。

Code


import java.util.*;
import java.io.*;
// 1:无需package
// 2: 类名必须Main, 不可修改public class Main {static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));static StreamTokenizer sr = new StreamTokenizer(in);static int n;static int MAXN = 110;static int[] arr = new int[MAXN];static int[] dpl = new int[MAXN];static int[] dpr = new int[MAXN];public static void main(String[] args) throws IOException {n = nextInt();for(int i = 1; i <= n; i++) {arr[i] = nextInt();}for(int i = 1; i <= n; i++) {dpl[i] = 1;for(int j = 1; j < i; j++) {if(arr[i] > arr[j]) dpl[i] = Math.max(dpl[i], dpl[j] + 1);}}for(int i = n; i >= 1; i--) {dpr[i] = 1;for(int j = i + 1; j <= n; j++) {if(arr[i] > arr[j]) dpr[i] = Math.max(dpr[i], dpr[j] + 1);}}int ans = n;for(int i = 1; i <= n; i++) {ans = Math.min(ans, n - (dpl[i] + dpr[i] - 1));}out.println(ans);out.flush();}static int nextInt() throws IOException {sr.nextToken();return (int)sr.nval;}
}

这篇关于1.合唱队形的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/711207

相关文章

[Algorithm][综合训练][体育课测验(二)][合唱队形][宵暗的妖怪]详细讲解

目录 1.体育课测验(二)1.题目链接2.算法原理详解 && 代码实现 2.合唱队形1.题目链接2.算法原理详解 && 代码实现 3.宵暗的妖怪1.题目链接2.算法原理详解 && 代码实现 1.体育课测验(二) 1.题目链接 体育课测验(二) 2.算法原理详解 && 代码实现 说明:单纯积累一题[拓扑排序]用于加强印象 能识别模型,并且写出代码 vector<i

九度OJ-1131:合唱队形(最长递增子序列)

本题可以以“求最长递增子序列长度”为模板。 问题抽象:即求最长合唱子序列长度。所谓“合唱子序列”,即:该子序列满足 T1 < T2 < … < Ti , Ti > Ti+1 > … > TK (1 <= i <= K).(凸函数图像) 算法分析:正向求一次LIS存dp[],反向求一次LIS存dpR[]。然后dp[j]+dpR[j]-1即为最长合唱子序列长度。 题目描述:

九度1131_合唱队形【LIS】【LCS】

题目1131:合唱队形 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1706 解决:529 题目描述: N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合唱队形。 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1, 2, …, K,他们的身高分别为T1, T2, …, TK, 则他们的身高满足T1 <

动态规划之合唱队形问题(最长递增子序列变形)

题目描述  N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合唱队形。 合唱队形定义:设K位同学从左到右依次编号为1, 2, …, K,他们的身高分别为T1, T2, …, TK, 则他们的身高满足T1 < T2 < … < Ti, Ti > Ti+1 > … > TK (1 <= i <= K)。  要求:已知所有N位同学的身高,计算最少需

华为OJ——合唱队

合唱队 题目描述 计算最少出列多少位同学,使得剩下的同学排成合唱队形 说明: N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。  合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK,   则他们的身高满足存在i(1<=i<=K)使得T1<T2<......<Ti-1<Ti>Ti+1>.....

动态规划刷题(算法竞赛、蓝桥杯)--合唱队形(线性DP)

1、题目链接:[NOIP2004 提高组] 合唱队形 - 洛谷 #include <bits/stdc++.h>using namespace std;int n,ans;int a[105],f[105][2];//f[i][2]中2表示正反两个方向int main(){cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}//正方向求最长上升子序列 a[0

【牛客网】合唱队

牛客网合唱队 题目描述 计算最少出列多少位同学,使得剩下的同学排成合唱队形 说明: N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足存在i(1<=i<=K)使得T1<T2<…<Ti-1Ti+1>…>TK。 你的任务是,已

题目:合唱队形(蓝桥OJ 0724)

问题描述: 解题思路:          LIS的拓展,枚举i,以i位置为最长上升子序列的终点、最长下降子序列的起点。将上升与下降的值相加得以i位置为最高点得队形总人数。最后比较每个i位置(1~n)总人数的大小得最大队形总人数,最小剩下人数 = 全部同学数 - 最大队形总人数。 题解: #include <bits/stdc++.h>using namespace std;

牛客网 华为机试 合唱队

本题抽象出来,我们需要找到最长递增子序列,还需要一个最长递减子序列,然后两个子序列的长度相加减去1就是我们这个合唱队的最大长度。然后我们用所有的人数减去合唱队最大长度,就是我们要求的最少需要几位同学出列。 这个题和上一题求最长递增子序列类似,只不过是又求了一个递减子序列,然后进行运算即可。 我们仍采用动态规划来解决。dp[i]表示包含nums[i]在内的最长递增子序列的长度。在本题中我们需要

牛客刷题|HJ24 合唱队,HJ25 数据分类处理 , HJ26 字符串排序

HJ24 合唱队 题目链接:合唱队_牛客题霸_牛客网 (nowcoder.com) 思路:对队列中每个元素分别找左边最长递增序列和右边最长递减序列(都不一定是连续的),那么以当前元素为“山顶”可以保留的最大人数就是两者之和减一。 寻找最长递增序列可以用动态规划实现。 但测试用例只通过了2/20,我使用其它用户发的代码并作了些格式上的修改,依然只能通过2/20。有没有人能告诉为什么:( 代