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

2024-06-03 14:18

本文主要是介绍动态规划之合唱队形问题(最长递增子序列变形),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述 
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 <iostream>
#include <stdio.h>
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 headint 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;
}

这篇关于动态规划之合唱队形问题(最长递增子序列变形)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

基于.NET编写工具类解决JSON乱码问题

《基于.NET编写工具类解决JSON乱码问题》在开发过程中,我们经常会遇到JSON数据处理的问题,尤其是在数据传输和解析过程中,很容易出现编码错误导致的乱码问题,下面我们就来编写一个.NET工具类来解... 目录问题背景核心原理工具类实现使用示例总结在开发过程中,我们经常会遇到jsON数据处理的问题,尤其是

Vue中动态权限到按钮的完整实现方案详解

《Vue中动态权限到按钮的完整实现方案详解》这篇文章主要为大家详细介绍了Vue如何在现有方案的基础上加入对路由的增、删、改、查权限控制,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、数据库设计扩展1.1 修改路由表(routes)1.2 修改角色与路由权限表(role_routes)二、后端接口设计

springboot3.4和mybatis plus的版本问题的解决

《springboot3.4和mybatisplus的版本问题的解决》本文主要介绍了springboot3.4和mybatisplus的版本问题的解决,主要由于SpringBoot3.4与MyBat... 报错1:spring-boot-starter/3.4.0/spring-boot-starter-

在 Spring Boot 中使用异步线程时的 HttpServletRequest 复用问题记录

《在SpringBoot中使用异步线程时的HttpServletRequest复用问题记录》文章讨论了在SpringBoot中使用异步线程时,由于HttpServletRequest复用导致... 目录一、问题描述:异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源二、问题详细分

解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题

《解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题》在Spring开发中,@Autowired注解常用于实现依赖注入,它可以应用于类的属性、构造器或setter方法上,然... 目录1. 为什么 @Autowired 在属性上被警告?1.1 隐式依赖注入1.2 IDE 的警告:

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

关于Nginx跨域问题及解决方案(CORS)

《关于Nginx跨域问题及解决方案(CORS)》文章主要介绍了跨域资源共享(CORS)机制及其在现代Web开发中的重要性,通过Nginx,可以简单地解决跨域问题,适合新手学习和应用,文章详细讲解了CO... 目录一、概述二、什么是 CORS?三、常见的跨域场景四、Nginx 如何解决 CORS 问题?五、基

MySQL安装时initializing database失败的问题解决

《MySQL安装时initializingdatabase失败的问题解决》本文主要介绍了MySQL安装时initializingdatabase失败的问题解决,文中通过图文介绍的非常详细,对大家的学... 目录问题页面:解决方法:问题页面:解决方法:1.勾选红框中的选项:2.将下图红框中全部改为英

前端 CSS 动态设置样式::class、:style 等技巧(推荐)

《前端CSS动态设置样式::class、:style等技巧(推荐)》:本文主要介绍了Vue.js中动态绑定类名和内联样式的两种方法:对象语法和数组语法,通过对象语法,可以根据条件动态切换类名或样式;通过数组语法,可以同时绑定多个类名或样式,此外,还可以结合计算属性来生成复杂的类名或样式对象,详细内容请阅读本文,希望能对你有所帮助...