合唱队形java_动态规划之合唱队形问题(最长递增子序列变形)
题目描述
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合唱队形。
合唱队形定义:设K位同学从左到右依次编号为1, 2, …, K,他们的身高分别为T1, T2, …, TK,
则他们的身高满足T1 < T2 < … < Ti, Ti > Ti+1 > … > TK (1 <= i <= K)。
要求:已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
输入
输入的第一行是一个整数N,表示同学的总数。
第一行有n个整数,用空格分隔,第i个整数Ti是第i位同学的身高(厘米)。
输出
输出包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
解题思路
定义n位同学的身高数组为a[n](注意这里数组长度不允许为变量,这里只是为了理解将n写如到[]中)。
【总体思路】:假设第i(0<= i <= n – 1)个同学为最高点,分别求出此时i左边的最长递增子序列长度inc1[i],i右边的最长递减子序列长度inc2[i],由于最高点i同时包括在了inc1[i]和inc2[i]之中,因此实际的合唱队形的长度为inc1[i] + inc2[i] – 1。而我们求得的最后结果就是i从1到n – 1中,使得inc1[i] + inc2[i] – 1最大的情况。
【具体实现】:现在设i为下标,循环i从0到n-1,求得各种i值对应的inc1[i];循环i从0到n-1,求得各种i值对应的inc2[i]。最后循环i从0到n-1,求得各种i值对应的inc[i] + inc2[i] – 1最大的情况ans,然后n – ans即为出列同学的人数。
当i = 0的时候,最高点0左边只有它自己,因此inc1[0] = 1;当i = n – 1的时候,最高点n – 1右边只有它自己,因此inc2[n – 1] = 1;当i处于0到n – 1之间时的求法也很好理解,在求inc1[i]时,j = (0 ~ i – 1)的inc[j]已经得出来了,所以我们只需要比较在前面的这些序列中加上a[i]时的最长递增序列,即在a[i]大于前面这些序列值的情况下inc[j] + 1最大的情况即为inc[i]。
源代码如下:
#include
#include
using namespace std;
int inc1[200],inc2[200],a[200];
//inc1-->longest increase array from head to tail
//inc2-->longest increase array from tail to head
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int ans=0,i,j;
for(i = 0; i < n; i++) //输入n个人的身高
scanf("%d",&a[i]);
//inc1[i]是存储以i为最高点时左边的递增子序列长度
inc1[0]=1;
for(i = 1; i < n; i++)
{
inc1[i] = 1;
for(j = 0; j < i; j++)
if(a[i] > a[j] && inc1[j] + 1 > inc1[i])
inc1[i] = inc1[j]+1;
}
//inc2[i]是存储以i为最高点时左边的递减子序列长度
inc2[n - 1] = 1;
for(i = n - 2; i >= 0; i--)
{
inc2[i] = 1;
for(j = n - 1; j > i; j--)
if(a[j] < a[i] && inc2[j] + 1 > inc2[i])
inc2[i] = inc2[j] + 1;
}
for(i = 0; i<=n; i++)
if(inc1[i] + inc2[i]-1 > ans)
ans = inc1[i] + inc2[i] - 1;
printf("%d\n",n-ans);
}
return 0;
}
合唱队形java_动态规划之合唱队形问题(最长递增子序列变形)相关推荐
- Leetcode动态规划:300.longest-increasing-subsequence(最长递增子序列)
300. 最长递增子序列 最近一直在攻克动态规划的题,Leetcode的简单题已经刷完,现在冲中等题,这道题算是一个比较经典的题吧,独立完成,虽然花了两个多小时,但收获很多: 思路:动态规划首先要找到 ...
- 动态规划设计方法详解最长递增子序列
很多读者反应,就算看了前文动态规划详解,了解了动态规划的套路,也不会写状态转移方程,没有思路,怎么办?本文就借助「最长递增子序列」来讲一种设计动态规划的通用技巧:数学归纳思想. 最长递增子序列(Lon ...
- 【动态规划刷题笔记】线性dp:合唱队形(最长递增子序列的变体)
[NOIP2004 提高组] 合唱队形 - 洛谷 思路:最少出列,即挑出最多,即找最长递增子序列和最长递减子序列 设dp1[i]为以h[i]结尾的最长递增子序列 dp2[i]为以h[i]开头的最长递减 ...
- 最长递增子序列 java_最长递增子序列问题---动态规划
最长递增子序列问题是一个很基本.较常见的小问题,但这个问题的求解方法却并不那么显而易见,需要较深入的思考和较好的算法素养才能得出良好的算法.由于这个问题能运用学过的基本的算法分析和设计的方法与思想,能 ...
- 动态规划(最长递增子序列)---最长递增子序列
最长递增子序列 300. Longest Increasing Subsequence (Medium) 题目描述: 给定一个数组,找到它的最长递增子序列 思路分析: 动态规划思想,定义一个数 ...
- 动态规划算法分析和理解:最长公共子序列、公共子字符串
定义啥的就不多说了,反正我有自己的理解就行.例题是,最长公共子序列和最长公共子字符串的动态规划求解过程 目录 一.递归和动态规划 二.动态规划求解步骤 三.最长公共子序列 四.最长公共子字符串 一.递 ...
- 动态规划算法-04最长递增子序列问题
最长递增子序列问题 简述 经典的动态规划问题. 问题描述 给定一个序列,求解其中长度最长的递增子序列. 问题分析 这种可以向下查询答案的很容易想到动态规划的解法. 要求长度为i的序列Ai={a1,a2 ...
- 动态规划应用--最长递增子序列 LeetCode 300
文章目录 1. 问题描述 2. 解题思路 2.1 动态规划 2.2 二分查找 1. 问题描述 有一个数字序列包含n个不同的数字,如何求出这个序列中的最长递增子序列长度?比如2,9,3,6,5,1,7这 ...
- 最长单调递增子序列_最长递增子序列(动态规划 + 二分搜索)
题目 给定数组arr,返回arr的最长递增子序列 举例:arr = [2,1,5,3,6,4,8,9,7],返回的最长递增子序列为[1,3,4,8,9] 要求:如果arr的长度为N,请实现时间复杂度为 ...
- 动态规划算法 | 最长递增子序列
通过查阅相关资料发现动态规划问题一般就是求解最值问题.这种方法在解决一些问题时应用比较多,比如求最长递增子序列等. 有部分人认为动态规划的核心就是:穷举.因为要求最值,肯定要把所有可行的答案穷举出来, ...
最新文章
- 上市 10 天就遭破解!AirTag 还能买吗?
- php获得注册信息,PHP网络编程:获取用户的注册信息[2]
- CATALINA_BASE和CATALINA_HOME,多实例tomcat与多版本tomcat运行
- [二叉树]二叉树中和为某一值的路径 (剑指offer24)
- java进阶之注解篇
- 白鹭引擎制作滚动框,类似div的oveflow
- 用C#製作PDF文件全攻略
- Android的异步多线程消息处理机制
- IPQ4019 QSDK 下添加RM500Q 5G 驱动 qmi拨号链接网络 配置 IPK包方法
- 前端性能优化 24 条建议
- narwal机器人_首款全自动扫拖一体机器人Narwal云鲸,彻底解放双手
- 服务器无线组网,物联网无线组网介绍
- 立创商城中的元件应用到AD中的一些经验
- 计算机软件由程序数据和文档组成其中主体是,chap03 计算机软件
- 二元逻辑回归(logistic regression)
- c语言scanf中 作用,c语言中scanf的用法
- 操作系统哲学原理(22)操作系统设计原理-操作系统设计之哲学原理
- 控制系统计算机仿真实验一,控制系统计算机仿真实验青岛科技大学
- JAVA计算机毕业设计薪酬福利管理信息系统计算机(附源码、数据库)
- openstack-11:安装dashiboard界面
热门文章
- FMI飞马网|如何尽早的接触人工智能才不会被抢饭碗,2030年会怎么样?
- 关于谷歌的一个简单工具以及chrome浏览器更新方法
- openmv实现二维码识别与串口发送
- Laravel - 从百草园到三味书屋 From Apprentice To Artisan目录
- w ndows中的文档文件是,在 Wndows 资源管理器中刻录 CD 或 DVD.doc
- extern C C 调用c++
- 将旧硬盘的内容克隆到新硬盘
- python 重定向 网址错_Python URL重定向问题
- 蛋糕甜品小程序有哪些,这3款小程序值得收藏!
- -O1 -O2 -O3 优化的原理是什么?