2018 计蒜之道 初赛 第二场

题解:dp[a[i]]=max(dp[a[i]-d]~dp[a[i]+d])。

感受:学会看数据啊,刚开始想的是贪心,发现可以不连续,看了数据,想了分块,线段树。。。最后发现可以dp。刚好一个小时

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 const int maxn = 100005;
 8 
 9 int T, n, d;
10 int a[maxn], dp[maxn];
11 
12 int main()
13 {
14     cin >> T;
15     while (T--) {
16         cin >> n >> d;
17         memset(dp, 0, sizeof(dp));
18         for (int i = 1; i <= n; i++) cin >> a[i];
19         dp[a[1]] = 1;
20         for (int i = 2; i <= n; i++) {
21             int start = max(1, a[i] - d);
22             int end = min(100000, a[i] + d);
23             int ans = 0;
24             for (int j = start; j <= end; j++) {
25                 ans = max(ans, dp[j]);
26             }
27             dp[a[i]] = ans + 1;
28         }
29         int ans = 0;
30         for (int i = 1; i <= 100000; i++) ans = max(ans, dp[i]);
31         cout << ans << endl;
32     }
33     return 0;
34 }
原文地址:https://www.cnblogs.com/zgglj-com/p/9034112.html