当前位置: 首页 > 编程日记 > 正文

【hdu】4521 小明序列【LIS变种】【间隔至少为d】

题目链接:https://vjudge.net/contest/228455#problem/B

转载于:https://blog.csdn.net/a709743744/article/details/51765252

题目大意:

求最长上升子序列,其中子序列中相邻的两个数的下标差要超过k

解题分析:

子序列中相邻的两个数的下标要超过k,要想满足这个条件我们可以按下面的思路想:

首先nlogn的LIS是毫无疑问的,然后再这个算法中,我们每次二分找到当前数的位置,如果数组中的数比当前数大的话就更新数组

所以我们可以稍微改一下上述步骤,当我们二分计算当前数的位置时,只是把当前数应该在数组中的位置保存下来,当前只更新在i - k之前的那个数,

这样我们就可以保证每次二分查找时,数组中的所有数的下标都比当前的下标少至少k.

然而我还是没有弄懂,先记录着吧。

这是我的代码,用结构体,然后套用了一下LIS模板,不知道为什WA

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 1e5 + 100;
int n, d;
struct node
{int val, ord;
}arr[MAXN],lis[MAXN];int find(int l, int r, int key)
{if (l == r)return l;int mid = (l + r) >> 1;if (key>lis[mid].val)return find(mid + 1, r, key);else return find(1, mid, key);
}int main()
{while (scanf("%d %d", &n, &d) != EOF){        //注意是下标之差大于d,而不是值之差大于dmemset(arr, 0, sizeof(arr));for (int i = 1; i <= n; i++) {scanf("%d", &arr[i].val);arr[i].ord = i;}int len = 0;for (int i = 1; i <=n; i++){if (i == 1)lis[++len] = arr[i];else if (arr[i].val > lis[len].val) {if ((arr[i].ord - lis[len].ord) > d)lis[++len] = arr[i];}else{int j = find(1, len, arr[i].val);if (j != len){if (j == 1){if ((lis[2].ord - arr[i].ord) > d)lis[j] = arr[i];}else{if ((lis[j + 1].ord - arr[i].ord) > d && (arr[i].ord - lis[j - 1].ord) > d)lis[j] = arr[i];}}}    }printf("%d\n", len);}return 0;
}
View Code

ACLIS解法

#include<iostream>
#include<cstring>
#include<cstdio>
#include <algorithm>
#define maxn 100005
using namespace std;
int a[maxn], b[maxn], p[maxn];
int n, d;int find(int p)   //二分查找<=p的位置+1
{int l, r, mid;l = 1, r = n, mid = (l + r) >> 1;while (l <= r){if (p>b[mid]) l = mid + 1;else if (p<b[mid]) r = mid - 1;else return mid;mid = (l + r) >> 1;}return l;
}int LIS(){int i, j, ans = 0;for (i = 1; i <= n; i++){p[i] = find(a[i]);         //p[i]存的是a[i]在上升数组中的位置ans = max(ans, p[i]);j = i - d;if (j>0) b[p[j]] = min(b[p[j]], a[j]);}return ans;
}int main()
{int i, res;while (cin >> n >> d){for (i = 1; i <= n; i++){scanf("%d", &a[i]);b[i] = maxn;}res = LIS();printf("%d\n", res);}return 0;
}

dp    AC解法

#include<cstdio>  
#include<cstring>  
#include<iostream>  
#include<algorithm>  
#define INF 0x3f3f3f3f  
using namespace std;
const int maxn = 100000 + 10;
int a[maxn], dp[maxn], g[maxn], n, k;int main()
{while (~scanf("%d%d", &n, &k)){int ans = -1;memset(dp, 0, sizeof(dp));memset(g, INF, sizeof(g));for (int i = 1; i <= n; i++)scanf("%d", &a[i]);for (int i = 1; i <= n; i++){                                                                   //延迟p位更新             //为什么我感觉i>k+1以后还是连续的,下标并没有相差k啊???搞不懂if (i - k - 1>0)  g[dp[i - k - 1]] = min(a[i - k - 1], g[dp[i - k - 1]]);        // i-p>1 是因为下标j范围为1<j<=mdp[i] = lower_bound(g + 1, g + 1 + n, a[i]) - g;       //先记录下a[i]在g数组中的位置       ans = max(ans, dp[i]);}cout << ans << endl;}return 0;
}

2018-05-17

转载于:https://www.cnblogs.com/00isok/p/9050736.html

相关文章:

【bootstrap】bootstrap-4.5.0-example 各个模板展示

前言&#xff1a;博主做前端开发的时候经常用到bootstrap&#xff0c;但挑选模板的时候&#xff0c;需要一个一个的打开文件夹、打开html文件再查看模板是否合适&#xff0c;这样实在有点浪费时间&#xff0c;所以今天博主将各个页面截图展示出来&#xff0c;之后方便大家也方便…

HDU1053 Entropy 哈夫曼树

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1053 认真读题&#xff0c;别怕题长&#xff0c;此题考查的就是哈夫曼树并求出最小编码值&#xff0c;注意每一次要将数组清0&#xff0c;否则会出错&#xff01; AC代码&#xff1a; #include<iostream>…

C++用数组和链表分别实现Queue

C用数组和链表分别实现Queue 昨天写了《C用数组和链表分别实现Stack》&#xff0c;今天就是《C用数组和链表分别实现Queue》&#xff0c; 队列就是先来的先被处理掉&#xff0c;后来的就等&#xff0c;直到成为先来的&#xff0c;实现起来感觉和栈差不多。 模板好用的&#xff…

bzoj1150 [CTSC2007]数据备份Backup

大概就是写了道生日礼物那个不知道叫啥的贪心。。。。。 大概就是说这道题和那个比较像。。。 所以留着看看吧&#xff0c;哪天想起了回来做这道题咯~ 转载于:https://www.cnblogs.com/LLppdd/p/9051440.html

004本周总结报告

这一周总的来说并没有学到多少东西。只是学习了java数组相关的知识&#xff0c;发现和C/C中的数组基本一样&#xff0c;同时也了解到堆内存和栈内存的概念。在学习数组时发现java数组的length属性很好用&#xff0c;学习了数组的插入赋值&#xff0c;冒泡和选择排序等并用数组的…

JS保留两位小数

JS保留两位小数 对于一些小数点后有多位的浮点数&#xff0c;我们可能只需要保留2位&#xff0c;但js没有提供这样直接的函数&#xff0c;所以我们得自己写函数实现这个功能&#xff0c;代码如下&#xff1a; function changeTwoDecimal(x) { var f_x parseFloat(x); if…

【资源分享】The Beatles(披头士)乐队所有专辑带封面

资源免费分享&#xff0c;送给各位披头士的粉丝。只求个赞可以吗。 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 链接:https://pan.baidu.com/s/1N5BXA18JeaznYhRRy6kiAw 提取码:5439

Serial Communications in Win32

http://msdn.microsoft.com/en-us/library/ms810467.aspx http://hi.baidu.com/beisika/blog/item/b204d58f6c3bece9513d9297.html

platform_driver_register适配的两种方式及probe是否启动与硬件关系

platform_driver_register2种方式学习 1.platform_device_register与platform_driver_register配合使用&#xff1a; 实例代码摘自下述网址&#xff1a; 这样当两个name一样时&#xff0c;就会嗲用mt65xx_leds_probe这个函数了。 static struct platform_driver mt65xx_leds_d…

Java中创建泛型数组

Java中创建泛型数组 使用泛型时&#xff0c;我想很多人肯定尝试过如下的代码&#xff0c;去创建一个泛型数组 T[] array new T[]; 当我们写出这样的代码时编译器会报Cannot create a generic array of T&#xff0c;初学泛型时&#xff0c;看到这个错就以为Java中不能创建泛型…

eclipse假死解决办法

因为要同时开发android&#xff0c;还有毕设要用myeclipse&#xff0c;装了太多插件&#xff0c;eclipse老卡死&#xff0c;解决办法如下&#xff1a; 1、关闭myeclipse的插件&#xff08;开发网页时再打开&#xff09;方法如下&#xff1a; &#xff08;1&#xff09;eclipse-…

Petapoco 连接oracle11g 自动生成poco时遇到的问题

偶尔在园子里看到.net的轻量级ORM框架Petapoco的介绍&#xff0c;觉得很有趣。相关介绍&#xff1a;PetaPoco&#xff1a;适用于.NET的微型ORM 正好最近有个C#Oracle11g的项目&#xff0c;想趁此机会试试用petapoco来做数据层的框架。 在配置步骤和遇到的问题&#xff0c;记录如…

网页分享插件 share.js 国外常用

这两天做推广&#xff0c;要求实现页面分享到国外各大社交媒体的功能。自己去翻各大厂的文档的话&#xff0c;实现起来时间相当长。 github 上找了个插件&#xff0c;很6. 地址&#xff1a; https://github.com/ellisonleao/sharer.js 支持主流的国外的社交媒体的分享。 主要支…

ORM操作models一对多、多对多关系

ORM操作 单表、一对多表操作 1 from django.db import models2 3 4 class UserGroup(models.Model):5 title models.CharField(max_length32)6 7 8 class UserInfo(models.Model):9 username models.CharField(max_length32) 10 password models.CharField(max…

【基础知识】如何快速转发CSDN博客

使用&#xff1a;火狐浏览器、Markdown编辑器 一、打开要转发的博客、按F12并点击查看器 二、复制页面的代码&#xff08;此处用到一个小技巧&#xff09; 1、鼠标点击该按钮 2、将鼠标放到图示位置&#xff0c;使变色的位置覆盖所有博客的内容后点击鼠标左键 3、看到下方代码…

SQLServer 系统表

SQLServer 系统表 http://blog.163.com/zangyunling126/blog/static/1646245052010101641620415/ http://www.cnblogs.com/yolion/archive/2007/10/08/916767.html SQL系统表说明 http://hi.baidu.com/etimeman/blog/item/3d5d82fc09bbfff8fc037fae.html SQLServer系统表详细说…

c#之旅--第一天

昨天开始的第一篇博客被我这个菜鸟找不到了&#xff0c;那就从今天开始吧废话也不多说了&#xff0c;good good study, day day up! 首先总结一下昨天所学&#xff1a; 从程序的开头开始吧&#xff0c;首先是引用&#xff0c;这里总结一下using的用法&#xff1a;1,。将外部命名…

第十一周总结CoreIDRAW

一、学到了什么&#xff1f; 1、交互式工具为制作逼真的特效提供了基础&#xff0c;如交互式调和工具常用于制作逼真的过滤效果&#xff1b;交互式阴影工具用于制作逼真的阴影&#xff1b;而交互式透明工具用于制作逼真的高光效果。 2、利用这些工具做了232页实训——画册制作和…

formatData

//解决传入0 格化后不返回空的问题function formatAmountValueNew(objValue,flag) { if(objValue!"" && objValue!null) { if(flag0) { // 验证输入金额数值或数值字符串&#xff1a; return objValue.toString().replace(/,/g, "");…

【java】将自己写的类生成说明文档的方法

使用工具&#xff1a; jdk中的javadoc 实现步骤&#xff1a; 1、将java文件放到一个目录之下 2、进入doc(winR,输入cmd) 3、通过cd指令进入存放java文件的文件夹 4、编译java文件 代码实现&#xff1a; javac HelloWorld.java 注&#xff1a; &#xff08;1&#xff09…

Scrapy和MongoDB的应用

Scrapy是Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取Web站点并从页面中提取结构化的数据.它最吸引人的地方在于任何人都可以根据需求方便的修改。 MongoDB是现下非常流行的开源的非关系型数据库&#xff08;NoSql&#xff09;&#xff0c;它是以“key-value…

linux bunzip2命令

Linux命令&#xff1a;bunzip2 功能说明&#xff1a;.bz2文件的解压缩程序。 语 法&#xff1a;bunzip2 [-fkLsvV][.bz2压缩文件] 补充说明&#xff1a;bunzip2可解压缩.bz2格式的压缩文件。bunzip2实际上是bzip2的符号连接&#xff0c;执行bunzip2与bzip2 - d的效果相同。 参…

[C++]C++中的IO类

C中的IO类 C语言不直接处理输入输出&#xff0c;而是通过一组定义在标准库中的类型来处理IO。这些类型支持从设备读取数据&#xff0c;向设备写入数据的IO操作&#xff0c;设备可以是文件&#xff0c;控制台窗口等。还有一些类型允许内存IO&#xff0c;即从string读取数据&…

solr 3.5 配置及服务器设置

一、solr 的简介 Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发&#xff0c;主要基于 HTTP 和 Apache Lucene 实现。Apache Solr 中存储的资源是以 Document 为对象进行存储的。每个文档由一系列的 Field 构成&#xff0c;每个 Field 表示资源的一个属性。Solr…

【基础知识】截长图的方法以及防止截图时下拉框自动收回的方法

截长图的方法&#xff1a; 博主之前使用的tim&#xff0c;不具备截长图的功能&#xff0c;之后百度了很多的方法&#xff0c;最后发现QQ的截长图功能最好用&#xff0c;很不解&#xff0c;tim不应该是偏向于办公吗&#xff0c;这种功能竟然还能阉割&#xff1f; 使用工具&#…

IFeature接口

用于设置一个要素的属性&#xff1a; 转载于:https://www.cnblogs.com/dengshiwei/p/4258741.html

IBM公司新推一个基于云计算的Web分析工具

据外媒报道&#xff0c;IBM最新推出了一个Web分析工具&#xff0c;结合了其现有的基于B/S架构的专业数据度量和分析工具 CoreMetrics和营销分析服务Unica。IBM在去年耗资4.8亿美元收购Unica&#xff0c;帮助企业分析客户数据&#xff0c;并预测他们的需求和行 动&#xff0c;Un…

【leetcode 字符串】466. Count The Repetitions

https://leetcode.com/problems/count-the-repetitions/description/ 找循环节 https://www.cnblogs.com/grandyang/p/6149294.html转载于:https://www.cnblogs.com/itcsl/p/9061427.html

TS - 处理故障的一些通用方法

本文是对解决问题的一些方法内容的改写与补充&#xff01; 首要的问题 对于发生在线上的问题&#xff0c; 最紧要的事项一定是“以最快最有效的方式解决问题&#xff0c;降低对线上业务的影响”&#xff0c;然后才是深挖问题&#xff0c;探求根本原因&#xff0c;防微杜渐&…