可能最近做二分和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. PHP保留小数的相关方法

    结合一下网上的例子 $num = 10.4567; //第一种:利用round()对浮点数进行四舍五入 但是这个如果没有两位小数也不会"两位精度" echo round($num, ...

  2. Java EE学习笔记(六)

    初识MyBatis 1.MyBatis的定义 1).MyBatis(前身是iBatis)是一个支持普通SQL查询.存储过程以及高级映射的持久层框架. 2).MyBatis框架也被称之为ORM(Obje ...

  3. vue.js 中如何解除绑定事件

    我们项目中有一个点赞需求,只允许点击一次赞,再次点击则取消赞, 为了防止用户多次连续点击,在点赞后需要解绑事件,成功调取API后,才可再次点击取消赞. 目前用的方法是加入一个flag控制点击事件可否点 ...

  4. [已读]精通AngularJS

    觉得可以看第二遍,内容其实还不错啦,就是翻译会有点生硬.

  5. Spark Mllib里如何将数据集按比例随机地分成trainData、testData和validationData数据集(图文详解)

    不多说,直接上干货! 具体详情见 Hadoop+Spark大数据巨量分析与机器学习整合开发实战的第11章 电影推荐引擎

  6. 牛客网Java刷题知识点之同步方法和同步代码块的区别(用synchronized关键字修饰)

    不多说,直接上干货! 扩展博客 牛客网Java刷题知识点之多线程同步的实现方法有哪些 为何要使用同步?      java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查 ...

  7. PHP知识点总结2

    PHP5数据类型 String(字符串), Integer(整型), Float(浮点型), Boolean(布尔型), Array(数组), Object(对象), NULL(空值). 字符串 你可 ...

  8. 剖析 Rails 3 MVC 中的数据传递

    引用链接:https://www.ibm.com/developerworks/cn/web/1108_linhx_rails3mvc/ 如果读者已经开发过基于 Rails 的应用,但对其 MVC 间 ...

  9. poj2135 最小费用流

    添加超级源点(与点1之间的边容量为2,权值为0)和超级汇点(与点N之间的边容量为2,权值为0),求流量为2的最小费用流.注意是双向边. #include <iostream> #inclu ...

  10. adhoc无法下载应用程序 此时无法安装-解决

    解决方法 点击xcode,进入build setting,选择code signing,provisioning profile选择automatic 或者选择adhoc的provisioning p ...