php实现  合唱队形(算法想清楚在动)

一、总结

一句话总结:写一个最长递增子序列的函数,正反两遍扫一下就好。写函数这样不容易错。这个好像可以用二分来优化。

1、算法题怎么提高正确率和节约时间?

算法想清楚了在做,不然会出现莫名其妙,稀奇古怪的错误。

2、php中如何填充数组?

用array_fill();

array array_fill ( int $start_index , int $num , mixed $value )

$a = array_fill(5, 6, 'banana');

Array
(
[5] => banana
[6] => banana
[7] => banana
[8] => banana
[9] => banana
[10] => banana
)

二、合唱队形

题目描述

计算最少出列多少位同学,使得剩下的同学排成合唱队形

说明:

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

输入描述:

整数N

输出描述:

最少需要几位同学出列

示例1

输入

复制

8
186 186 150 200 160 130 197 200

输出

复制

4

代码一:

 <?php
//谋而后动,之前算法有问题
while($n=trim(fgets(STDIN))){
$numStr=trim(fgets(STDIN));
$arr=explode(' ',$numStr);
for($i=0;$i<$n;$i++){
$gao[$i]=1;
$gaoRev[$i]=1;
}
//print_r($arr);
for($i=0;$i<$n;$i++){//遍历每一个人
for($j=0;$j<$i;$j++){//遍历他们前面的
if($arr[$i]>$arr[$j]&&$gao[$j]+1>$gao[$i]) $gao[$i]=$gao[$j]+1;
}
}
for($i=$n-1;$i>0;$i--){//遍历每一个人
for($j=$n-1;$j>$i;$j--){//遍历他们前面的
if($arr[$i]>$arr[$j]&&$gaoRev[$j]+1>$gaoRev[$i]) $gaoRev[$i]=$gaoRev[$j]+1;
}
}
for($i=0;$i<$n;$i++) $ans[$i]=$n+1-$gao[$i]-$gaoRev[$i];
//print_r($gao);
//print_r($gaoRev);
echo min($ans).PHP_EOL;
} ?>

代码二:

 <?php

 function lis($arr){
$dp = array_fill(0,count($arr),1);
$ends = array_fill(0,count($arr),0);
$l = 0; $r = 0; $right = 0;
$ends[0] = $arr[0];
for($i = 1; $i<count($arr);$i++) {
$l = 0;
$r = $right;
while ($l <= $r) {
$mid = floor(($l + $r)/2);
if($arr[$i]>$ends[$mid]) {
$l = $mid + 1;
}else {
$r = $mid - 1;
}
}
$right = max($right,$l);
$dp[$i] = $l+1 ;
$ends[$l] = $arr[$i];
}
return $dp;
} //两遍最长递增子序列 和最大
while (fscanf(STDIN,"%d",$N)) {
$T = explode(" ",trim(fgets(STDIN)));
$lis1 = lis($T);
$lis2 = lis(array_reverse($T));
$lis2 = array_reverse($lis2);
for($i=0;$i<$N;$i++){
$lis1[$i] += $lis2[$i];
}
$max = max($lis1);
/* $dp1 = array_fill(0,$N,1);
$dp2 = array_fill(0,$N,1);
for($i=0;$i<$N;$i++){
for($j=$i-1;$j>=0;$j--){
if($T[$j]<$T[$i]&&$dp1[$j]+1>$dp1[$i])
$dp1[$i] = $dp1[$j]+1;
}
}
$Tr = array_reverse($T);
for($i=0;$i<$N;$i++){
for($j=$i-1;$j>=0;$j--){
if($Tr[$j]<$Tr[$i]&&$dp2[$j]+1>$dp2[$i])
$dp2[$i] = $dp2[$j]+1;
}
}
$dp2 = array_reverse($dp2); $max = -1;
$sum = 0;
for($i=0;$i<$N;$i++){
$sum = $dp1[$i]+$dp2[$i];
if($sum>$max)
$max = $sum;
} */
echo ($N-$max+1)."\n"; }
?>
 

php实现 合唱队形(算法想清楚在动)的更多相关文章

  1. 洛谷 P1091 合唱队形

    \[传送门在这里呀\] 题目描述 \(N\)位同学站成一排,音乐老师要请其中的\((N-K)\)位同学出列,使得剩下的\(K\)位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次 ...

  2. [NOIP2004] 提高组 洛谷P1091 合唱队形

    题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2, ...

  3. NOIP 2004 合唱队形

    洛谷 P1091 合唱队形 https://www.luogu.org/problemnew/show/P1091 JDOJ 1271: [NOIP2004]合唱队形 T3 https://neooj ...

  4. 【模板】LIS模板 洛谷P1091 [NOIP2004提高组]合唱队形 [2017年4月计划 动态规划11]

    以题写模板. 写了两个:n^2版本与nlogn版本 P1091 合唱队形 题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队 ...

  5. 【题解】合唱队形——LIS坑爹的二分优化

     题目 [题目描述]N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形.合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1 ...

  6. 合唱队形2(洛谷U5874)

    题目背景 上次老师挑出来的(N-K)位同学很不高兴,于是他们准备自己组建合唱队形.他们请了kkk来帮忙. 题目描述 他们安排了一个动作--手拉着手唱一首歌(就是他们围成一个圈).如果有两个相邻的同学的 ...

  7. 合唱队形2 洛谷U5874

    题目背景 上次老师挑出来的(N-K)位同学很不高兴,于是他们准备自己组建合唱队形.他们请了kkk来帮忙. 题目描述 他们安排了一个动作——手拉着手唱一首歌(就是他们围成一个圈).如果有两个相邻的同学的 ...

  8. TYVJ P1067 合唱队形 Label:上升子序列?

    背景 NOIP2004 提高组 第三道 描述     N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号 ...

  9. NOIP200407合唱队形+最长上升子序列O(n^2)详解

    合唱队形解题报告 2016-05-12   4:30——6:45 NOIP200407合唱队形 难度级别:A: 运行时间限制:1000ms: 运行空间限制:256000KB: 代码长度限制:20000 ...

随机推荐

  1. jquery 04

    $('div').slice(1,3).css('background','red').end().css('color','blue');  入栈原理图: <!DOCTYPE HTML> ...

  2. js16--自定义原型对象

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  3. 【编程】概念的理解 —— socket

    socket:A socket is something into which something is plugged or fitted (also called a receptacle). A ...

  4. sql之group by的用法

    1.概述 “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理. 2.原始表 3.简 ...

  5. [Javascript] Different ways to create an new array/object based on existing array/object

    Array: 1. slice() const newAry = ary.slice() 2. concat const newAry = [].concat(ary) 3. spread oprea ...

  6. ubuntu14中 memcached安装与使用

    第一步,先安装lib-event 下载lib-event  的包http://libevent.org/ 下载完之后,解压安装 ./configure –prefix=/usr (或 ./config ...

  7. HDU 3864 D_num Miller Rabin 质数推断+Pollard Rho大整数分解

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=3864 题意:给出一个数N(1<=N<10^18).假设N仅仅有四个约数.就输出除1外的三个约 ...

  8. POJ Oulipo(KMP模板题)

    题意:找出模板在文本串中出现的次数 思路:KMP模板题 #include<cstdio> #include<cstring> #include<cmath> #in ...

  9. win7桌面有个无法删除的IE图标

    平台:win7 症状:安装软件时没仔细看,结果装上了一大堆,挨个卸载后桌面残留了一个IE无法删除.在该图标上点右键只有“打开”“属性”“创建快捷方式”三个选项,主页默认为www.2345.com. 解 ...

  10. ECMall 25个 数据库表 说明文档

    ecm_acategory //文章分类表 字段 类型 Null 默认 注释 cate_id int(10) 否   自增ID号,分类ID号 cate_name varchar(100) 否   分类 ...