【dp】淘宝的推荐系统
可能最近做二分和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】淘宝的推荐系统的更多相关文章
- 计蒜客 淘宝的推荐系统【DP】
题目链接:https://nanti.jisuanke.com/t/26984 ...
- 淘宝的推荐系统 计算之道2A
小明刚刚入职淘宝,老大给他交代了一个简单的任务,实现一个简易的商品推荐系统. 这个商品推荐系统的需求如下: 一共有 n 件商品可以被推荐,他们的编号分别为 1 到 n.每件商品都有一个价格,编号为 i ...
- "淘宝推荐系统简介"分享总结
概述: 此分享是关于淘宝推荐系统简介 1.推荐引擎就是:如何找到用户感兴趣的东西和以什么形式告诉用户:2.推荐引擎的作用:提高用户忠诚度,提高成交转化率和提高网站交叉销售能力:3.推荐系统核心:产品, ...
- Zencart先生成订单后付款,类似淘宝后台修改订单价格
Zencart 使用 Paypal 付款,会出现漏单的情况,即 paypal 已经收到客户的付款,但是网站后台没有客户的订单.导致 paypal 漏单的原因大致会是当客户跳转到Paypal 网站付款完 ...
- python 脚本开发实战-当当亚马逊图书采集器转淘宝数据包
开发环境python2.7.9 os:win-xp exe打包工具pyinstaller 界面tkinter ============================================= ...
- python就业班-淘宝-目录.txt
卷 TOSHIBA EXT 的文件夹 PATH 列表卷序列号为 AE86-8E8DF:.│ python就业班-淘宝-目录.txt│ ├─01 网络编程│ ├─01-基本概念│ │ 01-网络通信概述 ...
- python课件-淘宝-目录.txt
卷 TOSHIBA EXT 的文件夹 PATH 列表卷序列号为 AE86-8E8DF:.│ python课件-淘宝-目录.txt│ ├─01python核心编程阶段-linux基础(│ linux_h ...
- 【转】淘宝技术牛p博客整理
转自:http://blog.csdn.NET/zdp072/article/details/19574793 淘宝技术委员会是由淘宝技术部高级技术人员组成的一个组织,共分为Java分会.C/C++分 ...
- [TB-Technology] 淘宝在数据处理领域的项目及开源产品介绍
淘宝在数据存储和处理领域在国内互联网公司中一直保持比较靠前的位置,而且由于电子商务领域独特的应用场景,淘宝在数据实时性和大规模计算及挖掘方面一直在国内保持着领先,因此积累了很多的实践的经验和产品. T ...
随机推荐
- IT兄弟连 JavaWeb教程 Servlet会话跟踪 创建Cookie
Tomcat作为Web服务器,对Cookie提供了良好的支持.那么,运行在Tomcat的Servlet该如何访问Cookie呢?幸运的是,Servlet无需直接和HTTP请求或响应中的原始Cookie ...
- JAVA团队开发手册 - 3. 开发流程
开发流程 对于一个项目,最大的问题就是如何拆解为任务,分配到合适的人手里,并在有限的时间内完成它. 就像做建筑工程一样,其实做IT也是可以量化的,可能有的人砌砖砌得慢一些,有的人快一些. 但是我们把整 ...
- scrapy框架的命令行解释
scrapy框架的命令解释 创建爬虫项目 scrapy startproject 项目名例子如下: scrapy startproject test1 这个时候爬虫的目录结构就已经创建完成了,目录结构 ...
- 牛客寒假6-J.迷宫
链接:https://ac.nowcoder.com/acm/contest/332/J 题意: 你在一个 n 行 m 列的网格迷宫中,迷宫的每一格要么为空,要么有一个障碍. 你当前在第 r 行第 c ...
- Tomcat固定的目录结构
1. /work Tomcat把由Jsp生成的Servlet放于此目录下. 2. /webapps 当发布Web应用时,默认情况下把Web应用文件放于此目录下. 3. /logs 存放Tomcat的日 ...
- python学习之高级特性:
切片:对列表.元组.字符串.字典取中间的一部分,在C中一般是通过for循环拷贝/memcpy/strcat等操作.而python提供了更方便的切片操作符[m:n]:前闭后开,如果从0取m可以省略:如果 ...
- C#泛型学习笔记
泛型默认值default 如果T是int默认是0 str默认是null public class MyTest<T>{ public T GetValue() { T t = defau ...
- 对象(Object)和类(Class)的关系?
对象属于某一类,即对象是某一个类的实例.例如: Public Class Flight Private _name As String Public Property Name As String G ...
- LaTeX入门简介
原创链接 http://blog.csdn.net/perfumekristy/article/details/8515272 1.LaTeX软件的安装和使用 方法A(自助):在MikTeX的官网下载 ...
- Windows系统下Android开发环境搭建
“工具善其事,必先利其器”.要想学好Android,搭建好Android开发环境是一个良好的开端. Windows系统下Android开发环境主要有4个大的步骤.分别是: 1.JDK的安装 2.ecl ...