fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7.  
  8. const int INF = 1e9;
  9. const ll LINF = 1e18;
  10.  
  11. template<typename T>
  12. void maximize(T& a, const T& b) {
  13. if (a < b) a = b;
  14. }
  15.  
  16. const int BAD_MASK = (1 << 1) | (1 << 9) | (1 << 8);
  17. const int MAX_MASK = (1 << 10) - 1;
  18. const int N = 2e3 + 5;
  19.  
  20. int n;
  21. int b[N];
  22. int dp[N][1 << 10]; // dp[i][mask] = Độ dài của dãy con SEQ198 dài nhất khi xét đến phần tử thứ i,
  23. // với mask là tập hợp các hiệu <= 9 của b[i] với các phần tử đã chọn
  24.  
  25. int main() {
  26. ios::sync_with_stdio(false);
  27. cin.tie(nullptr);
  28. cin >> n;
  29. for (int i = 1; i <= n; i++) cin >> b[i];
  30.  
  31. sort(b + 1, b + n + 1);
  32.  
  33. dp[1][0] = 0; // không chọn b[1]
  34. dp[1][1] = 1; // chọn b[1]
  35.  
  36. for (int i = 1; i < n; i++) {
  37. int d = b[i + 1] - b[i];
  38. for (int mask = 0; mask <= MAX_MASK; mask++) {
  39. int next_mask = (d >= 10) ? 0 : ((mask << d) & MAX_MASK);
  40. // không chọn b[i + 1]
  41. maximize(dp[i + 1][next_mask], dp[i][mask]);
  42.  
  43. // chọn b[i + 1]
  44. if ((next_mask & BAD_MASK) == 0) maximize(dp[i + 1][next_mask | 1], dp[i][mask] + 1);
  45. }
  46. }
  47.  
  48. int ans = 0;
  49. for (int mask = 0; mask <= MAX_MASK; mask++) {
  50. maximize(ans, dp[n][mask]);
  51. }
  52. ans = n - ans;
  53.  
  54. cout << ans << '\n';
  55. }
Success #stdin #stdout 0.01s 5272KB
stdin
5
7 3 1 9 21
stdout
1