2018 计蒜之道 初赛 第二场 A题【DP】

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

                                                                       淘宝的推荐系统

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

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

输入格式

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

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

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

接下来一行输入 nn 个整数,第 ii 个整数表示 p_ipi

保证 1 \lt T \le 501<T50, 1 \le n \le 300001n30000, 0 \le d \le 1000d100, 1 \le p_i \le 10^51pi105。

保证 \sum n \le 6*10^5n6105。

输出格式

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

样例输入

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;
const int maxn = 1e5 + 10;
int n, d;
int a[maxn];
int Max[maxn];
int dp[maxn];
int getmax(int l, int r) {
    int ans = 0;
    for (int i = l; i <= r; i++) {
        ans = max(ans, Max[i]);
    }
    return ans;
}
void update(int l, int r, int d) {
    for (int i = l; i <= r; i++)
        Max[i] = max(Max[i], d);
}
int main() {
    int t;
    cin >> t;
    while (t--)
    {
        memset(Max, 0, sizeof(Max));
        cin >> n >> d;
        for (int i = 1; i <= n; i++) cin >> a[i];
        for (int i = 1; i <= n; i++)
        {
            int num = getmax(max(0, a[i] - d), min(a[i] + d, 100000));
            dp[i] = num + 1;
            Max[a[i]] = max(Max[a[i]], dp[i]);
        }
        int res = 0;
        for (int i = 1; i <= n; i++) res = max(res, dp[i]);
        cout << res << "\n";
    }
    return 0;
}
 
 

2018-05-13

猜你喜欢

转载自www.cnblogs.com/00isok/p/9033798.html