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

时间:2024-06-29 11:33:26

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

                                                                       淘宝的推荐系统

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

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

输入格式

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

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

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

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

保证 1<T≤50, 1≤n≤30000, 0 ≤d≤100, 1≤pi​≤1e5。

保证 ∑n≤6∗1e5。

输出格式

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

样例输入

2
6 3
5 7 3 6 10 9
8 6
4 7 9 5 8 1 9 10

样例输出

4
7
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
;
int n, d;
int a[maxn];
int Max[maxn];           //Max[i]表示最后一个推荐的商品价格为i的最大数量
int dp[maxn];            //dp[i]表示最后一个推荐的商品编号为i的最大数量
int getmax(int l, int r) {
    ;
    for (int i = l; i <= r; i++) {
        ans = max(ans, Max[i]);
    }
    return ans;    //找到符合条件的,推荐商品数量最大的值
}

int main() {
    int t;
    cin >> t;
    while (t--)
    {
        memset(Max, , sizeof(Max));
        cin >> n >> d;
        ; i <= n; i++) cin >> a[i];
        ; i <= n; i++)
        {
            , a[i] - d), min(a[i] + d, )); //对于价格为a[i]的商品,能转移Max[a[i]]的区间只有[a[i]-d,a[i]+d],然后进行暴力枚举转移即可
            dp[i] = num + ;                                            //因为Max数组编号大于i的此时Max[a[i]]的值都为0(仍然为初始值),所以能够保证按照编号上升的顺序给用户依次推荐商品
            Max[a[i]] = max(Max[a[i]], dp[i]);
        }
        ;
        ; i <= n; i++) res = max(res, dp[i]);
        cout << res << "\n";
    }
    ;
}


2018-05-13