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. 理解宏的使用 extern

    如何定义一个全局变量在一个文件中,然后在其它文件中调用就行,而不需要多次extern外部声明. 由于之前的公司的程序中全局的变量使用得很多,在多个.C文件中会调用,不这样处理做的话就会多处进行exte ...

  2. Writing buffer overflow exploits - a tutorial for beginners

    Buffer overflows in user input dependent buffers have become one of the biggest security hazards on ...

  3. Arch Linux实体机安装记录

    下面将记录笔者在戴尔笔记本安装arch linux的过程,用于记录,以便下次使用. 本文的内容参考arch linux官方Wiki. 首先,使用Power ISO把镜像安装到U盘,使用U盘安装. 通过 ...

  4. 数据库SQL Server2012笔记(七)——java 程序操作sql server

    1.crud(增删改查)介绍:create/retrieve/update/delete 2.JDBC介绍 1)JDBC(java database connectivity,java数据库连接) 2 ...

  5. python 命令行參数解析

    本文是从我还有一个博客转载过来的,欢迎大家点击进去看一下,帮我添加点人气^_^ ImPyy 选择模块 依据python參考手冊的提示,optparse 已经废弃,应使用 argparse 教程 概念 ...

  6. RocketMQ(九):消息发送(续)

    匠心零度 转载请注明原创出处,谢谢! RocketMQ网络部署图 NameServer:在系统中是做命名服务,更新和发现 broker服务. Broker-Master:broker 消息主机服务器. ...

  7. 1.2 Use Cases中 Log Aggregation官网剖析(博主推荐)

    不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ Log Aggregation 日志聚合 Many people use Kafka ...

  8. WebForm使用JQuery实现DropDownList无刷新联动

    目录(?)[-] 1  JS代码 2 页面相关控件用的是平台封装的控件普通DropDownList也可以 3 后台C代码 注意事项   原来用的微软封装的Ajax控件UpdatePannel和Scri ...

  9. R语言-回归

    定义: 回归是统计学的核心,它其实是一个广义的概念,通常指那些用一个或多个预测变量来预测响应变量.既:从一堆数据中获取最优模型参数 1.线性回归 1.1简单线性回归 案例:女性预测身高和体重的关系 结 ...

  10. 软件——机器学习与Python,输入输出的用法

    转自:http://www.cnblogs.com/graceting/p/3875438.html 输入很简单 x = input("Please input x:") Plea ...