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. Android开发经验之点击图片判断是否在图片范围之内

    package xiaosi.grivaty; import android.content.Context; import android.graphics.Bitmap; import andro ...

  2. code blocks主题颜色配置

    添加配置文件 注意:在添加这些自定义配置文件之前一定要先将之前的文件配置备份! 在添加时一定要确保Code::Blocks**没有**在运行!下载下面的文件,并将其添加到C:\Users\<你的 ...

  3. Docker 搭建java+tomcat

    1. 准备java和tomcat的软件包 jdk-7u79-linux-x64.tar.gz apache-tomcat-7.0.57.tar.gz 2. 编辑Dockerfile 文件 vim Do ...

  4. Android Studio使用Mob来获取手机验证码的源码

    本文来自:CSDN 感谢作者:qq_35812301(其实就是我的号!) 查看原文:http://blog.csdn.net/qq_35812301/article/details/79150775 ...

  5. 一个虐你千百遍的问题:“RPC好,还是RESTful好?”

    看到知乎上有这样一个问题 WEB开发中,使用JSON-RPC好,还是RESTful API好? 还有其他优秀的推荐方案吗? -------------------------------------- ...

  6. [Javascript AST] 3. Continue: Write ESLint rule

    The rule we want to write is show warning if user using console method: // valid foo.console() conso ...

  7. Fragment 实现的 分类 效果

    Fragment   实现的 分类 效果 布局文件的信息: <LinearLayout xmlns:android="http://schemas.android.com/apk/re ...

  8. StringBuilder类的使用总结

    String 对象是不可改变的.每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间.在需要对字符串执行重复修改的情况下,与创建新 ...

  9. Flask项目之手机端租房网站的实战开发(四)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...

  10. Ubuntu14.04中踩过的坑

    今天安装Ubuntu 14.0.4,因为需要使用python3,所以就直接配置如下:sudo rm /usr/bin/pythonsudo ln -s /usr/bin/python3.5  /usr ...