이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
typedef long long ll;
typedef pair<long long, long long> pll;
typedef pair<int,int> pii;
typedef vector<long long> vl;
typedef vector<int> vi;
int n, d;
vi arr;
const int INF = 2e9;
int cnt[7100], can_jump[7100][7100];
int main(){
cin>>n>>d;
for(int i = 1; i <= n; i++){
cin>>cnt[i];
arr.pb(cnt[i]);
}
if(d == n){
vi niza(n);
for(int i = 1; i <= n; i++)
niza[i-1] = cnt[i];
vi d(n+1, INF);
d[0] = -INF;
for(int i = 0; i < n; i++){
int l = upper_bound(d.begin(), d.end(), niza[i]) - d.begin();
if(d[l-1] < niza[i] && niza[i] < d[l])
d[l] = niza[i];
}
int ans = 0;
for(int l = 0; l <= n; l++){
if(d[l] < INF)
ans =l;
}
cout<<ans<<endl;
return 0;
}
sort(arr.begin(), arr.end());
memset(can_jump, 0, sizeof can_jump);
arr.erase(unique(arr.begin(), arr.end()), arr.end());
for(int i = 1; i <= n; i++) cnt[i] = lower_bound(arr.begin(), arr.end(), cnt[i]) - arr.begin() + 1;
for(int i = 1; i <= n; i++){
int last = i;
for(int j = i +1; j <= n; j++){
if(j - last <= d && cnt[i] < cnt[j]) can_jump[i][j] = 1;
if(j - last <= d && cnt[i] >= cnt[j]) last = j;
}
}
int dp[n+1];
for(int i = 1; i <= n; i++){
dp[i] = 1;
for(int j = 1; j < i; j++){
if(!can_jump[j][i]) continue;
dp[i] = max(dp[i], dp[j] + 1);
}
}
int ans = 0;
for(int i = 1; i <= n; i++)
ans = max(ans, dp[i]);
cout<<ans<<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... |