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

代码一:

 1 <?php
 2 //谋而后动,之前算法有问题
 3 while($n=trim(fgets(STDIN))){
 4 $numStr=trim(fgets(STDIN));
 5 $arr=explode(' ',$numStr);
 6 for($i=0;$i<$n;$i++){
 7     $gao[$i]=1;
 8     $gaoRev[$i]=1;
 9 }
10 //print_r($arr);
11 for($i=0;$i<$n;$i++){//遍历每一个人
12     for($j=0;$j<$i;$j++){//遍历他们前面的
13         if($arr[$i]>$arr[$j]&&$gao[$j]+1>$gao[$i]) $gao[$i]=$gao[$j]+1;
14     }
15 }
16 for($i=$n-1;$i>0;$i--){//遍历每一个人
17     for($j=$n-1;$j>$i;$j--){//遍历他们前面的
18         if($arr[$i]>$arr[$j]&&$gaoRev[$j]+1>$gaoRev[$i]) $gaoRev[$i]=$gaoRev[$j]+1;
19     }
20 }
21 for($i=0;$i<$n;$i++) $ans[$i]=$n+1-$gao[$i]-$gaoRev[$i];
22 //print_r($gao);
23 //print_r($gaoRev);
24 echo min($ans).PHP_EOL;
25 }
26
27 ?>

代码二:

 1 <?php
 2
 3 function lis($arr){
 4     $dp = array_fill(0,count($arr),1);
 5     $ends = array_fill(0,count($arr),0);
 6     $l = 0; $r = 0; $right = 0;
 7     $ends[0] = $arr[0];
 8     for($i = 1; $i<count($arr);$i++) {
 9         $l = 0;
10         $r = $right;
11         while ($l <= $r) {
12             $mid = floor(($l + $r)/2);
13             if($arr[$i]>$ends[$mid]) {
14                 $l = $mid + 1;
15             }else {
16                 $r = $mid - 1;
17             }
18         }
19         $right = max($right,$l);
20         $dp[$i] = $l+1 ;
21         $ends[$l] = $arr[$i];
22     }
23     return $dp;
24 }
25
26 //两遍最长递增子序列 和最大
27 while (fscanf(STDIN,"%d",$N)) {
28     $T = explode(" ",trim(fgets(STDIN)));
29     $lis1 = lis($T);
30     $lis2 = lis(array_reverse($T));
31     $lis2 = array_reverse($lis2);
32     for($i=0;$i<$N;$i++){
33         $lis1[$i] += $lis2[$i];
34     }
35     $max = max($lis1);
36     /* $dp1 = array_fill(0,$N,1);
37     $dp2 = array_fill(0,$N,1);
38     for($i=0;$i<$N;$i++){
39         for($j=$i-1;$j>=0;$j--){
40             if($T[$j]<$T[$i]&&$dp1[$j]+1>$dp1[$i])
41                 $dp1[$i] = $dp1[$j]+1;
42         }
43     }
44     $Tr = array_reverse($T);
45     for($i=0;$i<$N;$i++){
46         for($j=$i-1;$j>=0;$j--){
47             if($Tr[$j]<$Tr[$i]&&$dp2[$j]+1>$dp2[$i])
48                 $dp2[$i] = $dp2[$j]+1;
49         }
50     }
51     $dp2 = array_reverse($dp2);
52
53     $max = -1;
54     $sum = 0;
55     for($i=0;$i<$N;$i++){
56         $sum = $dp1[$i]+$dp2[$i];
57         if($sum>$max)
58             $max = $sum;
59     } */
60     echo ($N-$max+1)."\n";
61
62 }
63 ?>

转载于:https://www.cnblogs.com/Renyi-Fan/p/9228186.html

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

  1. 【例8】合唱队形(《信息学奥赛一本通第五版》)

    /* [例8]合唱队形(<信息学奥赛一本通第五版>) http://ybt.ssoier.cn:8088/problem_show.php?pid=1264 [问题描述] N位同学站成一排 ...

  2. 合唱队形(递增再递减的最长子序列)

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

  3. P1091 合唱队形[单调性+DP]

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

  4. P1091 合唱队形(LIS)

    题目描述 NNN位同学站成一排,音乐老师要请其中的(N−KN-KN−K)位同学出列,使得剩下的KKK位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2,-,K1,2, ...

  5. 洛谷P1091 合唱队形

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

  6. UOJ #214 合唱队形 (概率期望计数、DP、Min-Max容斥)

    UOJ #214 合唱队形 (概率期望计数.DP.Min-Max容斥) 9个月的心头大恨终于切掉了!!!! 非常好的一道题,不知为何uoj上被点了70个差评. 题目链接: http://uoj.ac/ ...

  7. tyvj 1067 合唱队形 dp LIS

    P1067 合唱队形 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2004 提高组 第三道 描述 N位同学站成一排,音乐老师要请其中的(N-K)位 ...

  8. 洛谷1091合唱队形

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

  9. 【DP】合唱队形(jzoj 1122)

    合唱队形 jzoj 1122 题目大意: 有n个人,按一定的顺序站成一排,最少减去多少个人可以使队列以一个人为中心,两边分别递减 输入样例 8 186 186 150 200 160 130 197 ...

  10. 动态规划练习2 [合唱队形]

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

最新文章

  1. 在windows程序中嵌入Lua脚本引擎--编写自己的Lua库
  2. 【深度学习】基于Pytorch多层感知机的高级API实现和注意力机制(二)
  3. PHP中三元运算符的用法_php中三元运算符用法_PHP教程
  4. eclipse安装lombok插件 ,但是:lombok注解不起作用(亲测有效!)
  5. JAVA知识积累 JSP第一篇【JSP介绍、工作原理、生命周期、语法、指令、行为】...
  6. JavaScript中执行环境和栈
  7. WPF ----在UserControl的xaml里绑定依赖属性
  8. python学习笔记10-匿名函数lambda
  9. Centos8 加密 GRUB 防破解root密码
  10. 如何检查Django版本
  11. Xshell使用教程及WinSCP使用教程
  12. matlab进化树的下载,MEGA进化树下载
  13. 中国做图像处理的公司
  14. python求最值_python求极值点(波峰波谷)
  15. 集成了谷歌翻译、百度翻译、有道翻译、和金山翻译的小助手软件
  16. RabbitMQ3.10.7高级特性
  17. win10ltsc转版本,win10ltsc升级win11,无损
  18. 2022/7/23 日记
  19. 记华为云服务器配置mysql-Navicat连接
  20. cv2.findContours OpenCV图形轮廓函数python

热门文章

  1. xshell大神级配色-夜间最配
  2. 计算机二级MS office高级应用考试必看攻略(全部 考点)
  3. 30【源码】数据可视化大屏:基于 Echarts + Python Flask 实现的32-9超宽大屏 - 中国国际疫情实时追踪
  4. Android 应用资源(一)
  5. 统计遗传学:第五章,多基因评分PGS
  6. ubuntu16.04磁盘分区及挂载
  7. 夏敏捷 第39本著作《微信小程序游戏开发快速入门到实战》
  8. 从html源码中获取图片链接地址和视频链接地址
  9. Deecamp笔记——点云目标跟踪 Open3D连续可视化
  10. 计算bed区间gc含量,碱基深度等