博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态规划入门H - 合唱队形 (最优子序列的另一个应用,这里是最优递增和最优递减子序列的结合)...
阅读量:5900 次
发布时间:2019-06-19

本文共 1225 字,大约阅读时间需要 4 分钟。

题目:H - 合唱队形

N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1, 2, …, K,他们的身高分别为T1, T2, …, TK,则他们的身高满足T1 < T2 < … < Ti , Ti > Ti+1 > … > TK (1 <= i <= K)。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
Input
输入的第一行是一个整数N(2 <= N <= 100),表示同学的总数。第一行有n个整数,用空格分隔,第i个整数Ti(130 <= Ti <= 230)是第i位同学的身高(厘米)。
Output
输出包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
Sample Input
8
186 186 150 200 160 130 197 220
Sample Output
4

思路:用两个dp数组,一个用来存正向递增,一个用来存反向递增,然后最后对应相加,再求一个最大的子序列,(这里要求的是宽度,不是数值的和,所以都再清0之后,有相应的则进行+1,具体看代码就知道了);

注意:避免在两次寻找最优子序列的时候将其本身给重复进行相加了!!!

新技巧:通过找正向与反向的双向递增子序列,这样就可以解决有峰值的最优子序列问题;

代码:

#include
#include
int a[105],dp_left[105];int dp_right[105],dp[105];int main(){ int n,i,j,s; while(scanf("%d",&n)!=EOF){ memset(dp_left,0,sizeof(dp_left )); memset(dp_right,0,sizeof(dp_right )); for(i=0;i
a[j]) dp_left[i]=dp_left[i]>(dp_left[j]+1)?dp_left[i]:(dp_left[j]+1); //就是这个位置,只需要进行加的操作即可; } } for(i=n-1;i>=0;--i){ for(j=n-1;j>i;j--){ if(a[i]>a[j]) dp_right[i]=dp_right[i]>(dp_right[j]+1)?dp_right[i]:(dp_right[j]+1); } } for(i=0;i

转载地址:http://jiesx.baihongyu.com/

你可能感兴趣的文章
读取txt文件,并用其他格式显示
查看>>
zabbix 3.2.7 (源码包)安装部署
查看>>
ubuntu16 升级后找不到 eth0 网卡 的解决方法
查看>>
看懂此文,不再困惑于 JS 中的事件设计
查看>>
vsCode 快捷键、插件
查看>>
IMapDocument interface
查看>>
职业生涯规划常用测试工具
查看>>
一些实用性的总结与纠正
查看>>
VC++ 6.0下多线程编程的最简单实例
查看>>
正则表达式之——POSIX正则表达式函数
查看>>
SQL截取字符串
查看>>
webpack练手项目之easySlide(二):代码分割(转)
查看>>
dubbo源码编译
查看>>
vue-validator(vue验证器)
查看>>
jQuery Ajax MVC 下拉框联动
查看>>
格雷码原理与Verilog实现
查看>>
P2569 股票交易
查看>>
每天一个linux命令(21):chgrp,chown,chmod
查看>>
html
查看>>
常见SQL Server导入导出数据的几个工具
查看>>