可能最近做二分和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. 【OpenJ_Bailian - 4137】最小新整数 (贪心)

    最小新整数 Descriptions: 给定一个十进制正整数n(0 < n < 1000000000),每个数位上数字均不为0.n的位数为m.现在从m位中删除k位(0<k < ...

  2. GenericKeychain

    KeychainItemWrapper是apple官方例子“GenericKeychain”里一个访问keychain常用操作的封装类,在官网上 下载了GenericKeychain项目后,只需要把“ ...

  3. log4j2中LevelRangeFilter的注意点

    LevelRangeFilter的注意点 在log4j2中,LevelRangeFilter的minLevel,maxLevel的配置是和log4j 1.x相反的:minLevel需要配置的是高级别, ...

  4. nodejs 学习(4) express+mongoose

    一.关于安装和启动: 1.设置环境变量:D:\Program Files\MongoDB\bin 2.启动时需要cd到bin 目录,然后 mongod --dbpath "D:\mongdb ...

  5. 《javascript设计模式》笔记之第六章:方法的链式调用

    这一章要实现的就是jQuery的那种链式调用,例子: $(this).setStyle('color', 'green').show(); 一:调用链的结构: 首先我们来看一下最简单的$()函数的实现 ...

  6. [转]nopcommerce之权限模块

    本文转自:http://www.nopchina.net/category/%E6%9E%B6%E6%9E%84.html 这篇文章简单介绍一下nopcommerce的权限模块,nopcommerce ...

  7. 对话框窗口最大化盖住任务栏问题!OnGetMinMaxInfo,WM_GETMINMAXINFO

    http://hi.baidu.com/csacer/item/37cd6ac2dec18d360831c6a7 在写程序时,如果包含了标题栏,但是没有包含最大化按钮或者最小话按钮,那么人工用Show ...

  8. IOS拉伸之底盖设置

    1.选定拉伸 UIImageView *fieldImage=[[UIImageViewalloc]initWithFrame:CGRectMake(37,48+35,240, 32)]; field ...

  9. Servlet Context

    Servlet Context Container Provider 负责提供ServletContext的实现. A ServletContext is rooted at a known path ...

  10. Android(java)学习笔记151:Android中操作JSON数据(Json和Jsonarray)

    1.Json 和 Xml       JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的 ...