从一列数中筛除尽可能少的数,使得从左往右看这些数是从小到大再从大到小

本文主要是介绍从一列数中筛除尽可能少的数,使得从左往右看这些数是从小到大再从大到小,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题:从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的(网易)。

解法:这是双端 LIS 问题,用 DP 的思想可解,目标规划函数 max{ b[i] + c[i] }, 其中 b[i] 为从左到右, 0 ~ i 个数之间满足递增的数字个数; c[i] 为从右到左, n-1 ~ i 个数之间满足递增的数字个数。最后结果为 n - max + 1。其中 DP 的时候,可以维护一个 inc[] 数组表示递增数字序列,inc[i] 为从小到大第 i 大的数字,然后在计算 b[i] c[i] 的时候使用二分查找在 inc[] 中找出区间 inc[0] ~ inc[i-1] 中小于 a[i] 的元素个数(low)。
源代码如下:

/** 
* The problem: 
* 从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的(网易)。 
* use binary search, perhaps you should compile it with -std=c99 
* fairywell 2011 
*/  
#include <stdio.h>  #define MAX_NUM    (1U<<31)  int  
main()  
{  int i, n, low, high, mid, max;  printf("Input how many numbers there are: ");  scanf("%d/n", &n);  /* a[] holds the numbers, b[i] holds the number of increasing numbers * from a[0] to a[i], c[i] holds the number of increasing numbers * from a[n-1] to a[i] * inc[] holds the increasing numbers * VLA needs c99 features, compile with -stc=c99 */  double a[n], b[n], c[n], inc[n];  printf("Please input the numbers:/n");  for (i = 0; i < n; ++i) scanf("%lf", &a[i]);  // update array b from left to right  for (i = 0; i < n; ++i) inc[i] = (unsigned) MAX_NUM;  //b[0] = 0;  for (i = 0; i < n; ++i) {  low = 0; high = i;  while (low < high) {  mid = low + (high-low)*0.5;  if (inc[mid] < a[i]) low = mid + 1;  else high = mid;  }  b[i] = low + 1;  inc[low] = a[i];  }  // update array c from right to left  for (i = 0; i < n; ++i) inc[i] = (unsigned) MAX_NUM;  //c[0] = 0;  for (i = n-1; i >= 0; --i) {  low = 0; high = i;  while (low < high) {  mid = low + (high-low)*0.5;  if (inc[mid] < a[i]) low = mid + 1;  else high = mid;  }  c[i] = low + 1;  inc[low] = a[i];  }  max = 0;  for (i = 0; i < n; ++i )  if (b[i]+c[i] > max) max = b[i] + c[i];  printf("%d number(s) should be erased at least./n", n+1-max);  return 0;  
}  



这篇关于从一列数中筛除尽可能少的数,使得从左往右看这些数是从小到大再从大到小的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/657467

相关文章

element table 表格 span-method 某一列进行相同合并 支持树结构表格

须知 这是 vue2 版本,不过理论上 vue3 也能参考使用 可以直接打开 codepen 查看代码 效果图 代码 打不开 codepen 或者codepen 失效,查看下面代码参考 <script src="//unpkg.com/vue@2/dist/vue.js"></script><script src="//unpkg.com/element-ui@2.15.14/l

Mongo 复制一列的值到另一列

在MySQL中 update table set a=b; 在Mongo中 db.eval(function() { db.collection.find({tag : "refurb"}).forEach(function(e) {e.Price = e.Price * 0.5;db.collection.save(e);});}); 参考文档 http://stackoverflo

【技巧】Excel检查单元格的值是否在另一列中

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 用到的excel函数 =IF(ISNUMBER(MATCH(H2, I2:I10, 0)), H2, "") 注意改上面的“H2、I2、I10”! 函数效果 函数解释 检查单元格 H2 中的值是否存在于指定的单元格范围 I2:I10 中。如果存在,就返

PL/SQ连接oracle,L 新建表的时候, virtual那一列是什么意思

PL/SQ连接oracle,L 新建表的时候, virtual那一列是什么意思 Virtual标示该栏位是否为虚拟列。 https://www.2cto.com/database/201306/216917.html posted @ 2017-12-14 10:46 酸奶加绿茶 阅读( ...) 评论( ...) 编辑 收藏

df的 一列,是文字, 比如 xxxxx-1, xxxx-2 , 最后有 -1 或者 -2,把最后的数字减去1,写道一个新的列里面

file_path=rf"D:\file\工作簿1-1.xlsx"# from stutil import PandasUtilimport pandas as pddf=pd.read_excel(file_path) # PandasUtil. # df的 一列,是文字, 比如 xxxxx-1, xxxx-2 , 最后有 -1 或者 -2,把 -1 变成 -0,其他不变# df[

幸运数 幸运数是波兰数学家乌拉姆命名的。它采用与生成素数类似的“筛法”生成。

package org.bluebridge.topics;/** 幸运数幸运数是波兰数学家乌拉姆命名的。它采用与生成素数类似的“筛法”生成。首先从1开始写出自然数1,2,3,4,5,6,.... 1 就是第一个幸运数。 我们从2这个数开始。把所有序号能被2整除的项删除,变为:1 _ 3 _ 5 _ 7 _ 9 ....把它们缩紧,重新记序,为: 1 3 5 7 9 .... 。这时,3为第2个幸

不用”if“,”?:“,”switch“或其他判断语句,求两个数中较大的数或较小的数

以下五种方法分别求出较大的数和较小的数的方法。较小数的代码在注释中,但未运行测试。 int Find1(int a, int b) {return ((a + b) + abs(a - b)) / 2;//return ((a + b) - abs(a - b)) / 2;}/*当a大于b时,a-b为正,右移sizeof(int) * 8 - 1后,最右侧一位为0,0^1 = 0;当a

【Pandas】读取或者写入csv文件会多出现一列----Unnamed:0

注意:读取或者写入pandas文件时出现新的一列 'Unnamed:0' 解决方案1: read_csv()时候,设置index_col=0即可。pd.read_csv(path,index_col=0)解决方案2: to_csv()时候,设置index=False。或者加上index=True, index_label=“id”df.to_csv(path,index=False)或者df.t

数三角形(二)》-筛除法斜线结论

算法思路: 1、一个直观的思路是筛除法,即:答案=总数-三点共线的种数 总数易求得,为组合数C((n+1)*(m+1),3),考虑到n、m数值范围,考虑用long long。 2、三点共线的情况有: (1)网格顶点同行,每行有m+1个顶点,共n+1行,共有:C(m+1,3) * (n+1) (2)网格顶点同列,每列有n+1个顶点,共m+1列,共有:C(n+1,3) * (m+1) (3)网格顶

python循环访问excel的某一列从某行开始的内容

python循环访问excel的某一列从某一行开始的内容 您可以使用openpyxl库来实现这个需求。以下是一个示例代码,展示了如何使用openpyxl读取Excel文件中的特定列(假设为第一列,从第二行开始): 可以使用Python的openpyxl库来读取Excel文件,并使用循环来访问某一列的内容。下面是一个示例代码: from openpyxl import load_workb