#include <iostream>
#include <vector>
#include <set>
using namespace std;
using pii = pair<int, int>;
const int N = 7005;
const int S = N+1;
const int INF = 1'000'000'005;
int n, d;
int a[N];
int f[S][N]; //minimalni mozna hodnota "maximalni a_x v rade se skorem s koncici i"
set<pii> mins[S];
int right_inc[S];
int check(int l, int r, int s){
while(right_inc[s] < r){
right_inc[s]++;
if(right_inc[s]-d >= 0){
mins[s].erase({f[s][right_inc[s]-d], right_inc[s]-d});
}
if(right_inc[s] < n){
mins[s].insert({f[s][right_inc[s]], right_inc[s]});
}
}
return mins[s].begin()->first;
}
int main(){
cin >> n >> d;
for(int i=0; i<n; i++){
cin >> a[i];
}
for(int i=0; i<n+1; i++){
right_inc[i] = -1;
for(int j=0; j<n+1; j++){
f[i][j] = INF;
}
}
for(int i=0; i<n; i++){
f[1][i] = a[i];
for(int s=2; s<=i+1; s++){
if(check(i-d, i-1, s-1) < a[i]){
f[s][i] = a[i];
} else {
f[s][i] = check(i-d, i-1, s);
}
}
}
for(int s=n; s>=0; s--){
if(f[s][n-1] != INF){
cout << s << endl;
break;
}
}
/*for(int i=0; i<n+1; i++){
for(int j=0; j<n; j++){
if(f[i][j]!=INF) cout << f[i][j] << " ";
else cout << 'X' << " ";
}
cout << endl;
}*/
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |