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

一、总结

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

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

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

2、php中如何填充数组?

用array_fill();

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

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

  1. Array
  2. (
  3. [5] => banana
  4. [6] => banana
  5. [7] => banana
  6. [8] => banana
  7. [9] => banana
  8. [10] => banana
  9. )

二、合唱队形

题目描述

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

说明:

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

输入

复制

  1. 8
  2. 186 186 150 200 160 130 197 200

输出

复制

  1. 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. ?>
 

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. Elasticsearch之es学习工作中遇到的坑(陆续更新)

    1:es集群脑裂问题(不要用外网ip,节点角色不要混用) 原因1:阿里云服务器,外网有时候不稳定. 解决方案:单独采购服务器,内网安装 原因2:master和node节点没有分开 解决方案: 分角色: ...

  2. 【AIM Tech Round 4 (Div. 2) C】Sorting by Subsequences

    [链接]http://codeforces.com/contest/844/problem/C [题意] 水题,没有记录意义 [题解] 排序之后,记录每个数字原来在哪里就好. 可以形成环的. 环的个数 ...

  3. Android Studio运行报错,Cannot find System Java Compiler. Ensure that you have installed a JDK......

    详细报错信息如下 Error:Execution failed for task ':app:compileDebugJavaWithJavac'. > Cannot find System J ...

  4. vue 自定义modal 模态框组件

    参数名 类型 说明 visible Boolean 是否显示,默认false title String 标题 update:visible Boolean 更新visible, 使用:visible. ...

  5. Ubuntu14.04中踩过的坑

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

  6. ASM学习笔记--ASM 4 user guide 第一章翻译

    ASM是什么? 借用别人的话 :ASM 是一个 Java 字节码操控框架.它能被用来动态生成类或者增强既有类的功能. ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机 ...

  7. [转]C#连接操作mysql实例

    本文转自:http://hi.baidu.com/zhqngweng/item/c4d2520cb7216877bfe97edf 第三方组件:Mysql.Data.dll说明:去官方网站下载Mysql ...

  8. NSAttributeString创建各种文字效果

    NSDictionary *attributes =@{ NSForegroundColorAttributeName: [UIColorredColor], NSFontAttributeName: ...

  9. 【MemSQL Start[c]UP 3.0 - Round 1 E】Desk Disorder

    [链接]h在这里写链接 [题意] 有N个人. 2N个座位. 现在告诉你这N个人它们现在的座位.以及它们想去的座位. 每个人可以去它们想去的座位或者就站在原地不动. 新的座位和旧的座位,都不允许一个座位 ...

  10. JavaFX2 - 文本可复制的Label

    背景介绍 我的公司和我个人一直都使用JavaFX2来编写client应用程序,同一时候也作为Applet在浏览器中执行. 我们的客户以前拿我们的产品和网页对照,然后向我们提过两个需求: (1) 希望界 ...