可能最近做二分和DFS做傻了?

小明刚刚入职淘宝,老大给他交代了一个简单的任务,实现一个简易的商品推荐系统。

这个商品推荐系统的需求如下:

一共有 n 件商品可以被推荐,他们的编号分别为 1 到 n。每件商品都有一个价格,编号为 i 的商品价格为 pi​ 元。现在需要给用户推荐尽可能多的商品,但是要保证按照编号上升的顺序给用户依次推荐商品,并且,相邻商品的价格之差的绝对值不能超过 d。注意,第一个推荐的商品价格没有限制。

输入格式

第一行输入一个整数 T,表示测试数据组数。

接下来依次输入 T 组数据,每组数据按照下面的格式输入:

第一行输入两个整数 n 和 d,意义如题目描述所示。

接下来一行输入 n 个整数,第 i 个整数表示 pi​。

保证 $1<T≤50$, $1≤n≤30000$, $0≤d≤100$, $1≤pi​≤10^5$。

保证 $∑n≤6∗10^5$。

输出格式

对于每组数据,输出一行一个整数,表示最多能推荐的商品个数。


题目分析

诶,思路大概被最近做的题目带的有点偏……

看到的第一眼是二分,然后果断叉掉了……

然后就开始想带记忆化的DFS,不过捣鼓了半天发现是会TLE的……

赛时dp一直没怎么理解,直到赛后才意识到好水好水的dp题目啊……

大概是dp姿势不太好吧……

这个是带记忆化的DFS:

 #include<bits/stdc++.h>
const int maxn = ; int tt,n,m,ans;
int a[maxn],anss[maxn];
bool vis[maxn]; int dfs(int now)
{
if (vis[now]) return anss[now];
int tt = now, cnt = ;
for (;;)
{
tt++;
while (abs(a[tt]-a[now])>m) tt++;
if (tt <= n) cnt = std::max(dfs(tt), cnt);
else break;
}
vis[now] = ;
return anss[now]=cnt+;
}
int main()
{
scanf("%d",&tt);
while (tt--)
{
ans = ;
scanf("%d%d",&n,&m);
memset(vis, , sizeof vis);
memset(anss, , sizeof anss);
for (int i=; i<=n; i++) scanf("%d",&a[i]),anss[i] = ;
for (int i=; i<=n; i++)
if (!vis[i])
ans = std::max(ans, dfs(i));
printf("%d\n",ans);
}
return ;
}

这个是dp:

 #include<bits/stdc++.h>
const int maxn = ; int tt,x,n,m,ans;
int f[maxn]; int main()
{
scanf("%d",&tt);
while (tt--)
{
ans = ;
scanf("%d%d",&n,&m);
memset(f, , sizeof f);
for (int i=; i<=n; i++)
{
scanf("%d",&x);
int w = f[x]+;
for (int j=std::max(, x-m); j<=std::min(maxn-, x+m); j++)   //不要局限于数据形式,把dp对象转移成权值
f[j] = std::max(f[j], w);
}
for (int i=; i<maxn; i++)
ans = std::max(ans, f[i]);
printf("%d\n",ans);
}
return ;
}

其中注意到权值较小,我们用$f[j]$表示权值等于$j$时的最大答案值,最后再扫一遍就好了。

关键在于这里的输入天然有序,因此$f[j]$表示$1~i-1$之中权值为$j$的答案数,也就是说这里是把n维的dp优化到了1维

END

【dp】淘宝的推荐系统的更多相关文章

  1. 计蒜客 淘宝的推荐系统【DP】

    题目链接:https://nanti.jisuanke.com/t/26984                                                             ...

  2. 淘宝的推荐系统 计算之道2A

    小明刚刚入职淘宝,老大给他交代了一个简单的任务,实现一个简易的商品推荐系统. 这个商品推荐系统的需求如下: 一共有 n 件商品可以被推荐,他们的编号分别为 1 到 n.每件商品都有一个价格,编号为 i ...

  3. "淘宝推荐系统简介"分享总结

    概述: 此分享是关于淘宝推荐系统简介 1.推荐引擎就是:如何找到用户感兴趣的东西和以什么形式告诉用户:2.推荐引擎的作用:提高用户忠诚度,提高成交转化率和提高网站交叉销售能力:3.推荐系统核心:产品, ...

  4. Zencart先生成订单后付款,类似淘宝后台修改订单价格

    Zencart 使用 Paypal 付款,会出现漏单的情况,即 paypal 已经收到客户的付款,但是网站后台没有客户的订单.导致 paypal 漏单的原因大致会是当客户跳转到Paypal 网站付款完 ...

  5. python 脚本开发实战-当当亚马逊图书采集器转淘宝数据包

    开发环境python2.7.9 os:win-xp exe打包工具pyinstaller 界面tkinter ============================================= ...

  6. python就业班-淘宝-目录.txt

    卷 TOSHIBA EXT 的文件夹 PATH 列表卷序列号为 AE86-8E8DF:.│ python就业班-淘宝-目录.txt│ ├─01 网络编程│ ├─01-基本概念│ │ 01-网络通信概述 ...

  7. python课件-淘宝-目录.txt

    卷 TOSHIBA EXT 的文件夹 PATH 列表卷序列号为 AE86-8E8DF:.│ python课件-淘宝-目录.txt│ ├─01python核心编程阶段-linux基础(│ linux_h ...

  8. 【转】淘宝技术牛p博客整理

    转自:http://blog.csdn.NET/zdp072/article/details/19574793 淘宝技术委员会是由淘宝技术部高级技术人员组成的一个组织,共分为Java分会.C/C++分 ...

  9. [TB-Technology] 淘宝在数据处理领域的项目及开源产品介绍

    淘宝在数据存储和处理领域在国内互联网公司中一直保持比较靠前的位置,而且由于电子商务领域独特的应用场景,淘宝在数据实时性和大规模计算及挖掘方面一直在国内保持着领先,因此积累了很多的实践的经验和产品. T ...

随机推荐

  1. boot接入elasticsearch

    boot接入elasticsearch 参考博客:https://blog.csdn.net/li521wang/article/details/83792552 项目源码demo:https://g ...

  2. seq(2018.10.24)

    一道\(dp\)题... 期望\(40\)分解法 预处理:离散化,然后让连续一段值相同的元素合并为一个元素. 正式\(DP\): 显然有个最差策略为每个元素处都切一次,则切的次数为元素的个数\(-1\ ...

  3. JDBC连接池一 自定义连接池

    package com.mozq.jdbc; import java.io.IOException; import java.io.InputStream; import java.sql.Conne ...

  4. servlet小型应用服务器搭建通过tomcat发布web项目

    1.servlet简介:Servlet 是一个 Java程序,是在服务器上运行以处理客户端请求并做出响应的程序 2.servlet的生命周期图解: 3.各阶段: 4.基本的servlet代码: pub ...

  5. jmeter diff测试(调用JAR包处理)

    1.准备接口数据(对比字段,即json数据中需要提取的key对应的值进行对比) 2.配置获取EXCEL数据 3.新建线程,并建两个http请求,分别用于请求新旧接口 4.提取需要对比的内容 5.赋值变 ...

  6. mybatis实现简单的增删查改

    接触一个新技术,首先去了解它的一些基本概念,这项技术用在什么方面的.这样学习起来,方向性也会更强一些.我对于mybatis的理解是,它是一个封装了JDBC的java框架.所能实现的功能是对数据库进行增 ...

  7. python入门之实例-用户登录、注册

    用户密码存储文件db(其中用户和密码之间用$符合隔开): admin$123456 root$sdfk9f24 chy$654321 代码如下: def login(username,password ...

  8. Docker容器与容器数据

    Docker容器与容器数据 image 与container 镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的 ...

  9. java mongodb-crud

    本篇文章主要介绍了mongodb对应java的常用增删改查的api,以及和spring集成后mongoTemplate的常用方法使用,废话不多说,直接上代码: 1.首先上需要用到的两个实体类User和 ...

  10. P1791 线段覆盖

    题目描述 已知数轴上0<N<10000条线段.每条线段按照端点Ai和Bi(Ai<>Bi,i=1..N)定义.端点坐标在(-999,999)内,坐标为整数.有些线段可能相交.编程 ...