两次dp,一次从左到右可以到的位置记为true,一次从右到左可以到的位置记为true。
如果从左到右可以直接到尾巴肯定YES,否则如果用一次超能力到达的位置可以到尾巴也YES。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t; cin>>t;
while(t--) {
int n,k; cin>>n>>k;
int h[n];
for(int i=0;i<n;i++)
cin>>h[i];
bool dp[n];
memset(dp,false,sizeof dp);
dp[0]=true;
for(int i=0;i<n-1;i++){
for(int j=i+1;j<=min(n-1,i+k);j++){
if(dp[i]&&h[i]>=h[j]) {
dp[j]=true;
}
}
}
// 不用超能力也可以
if(dp[n-1]==true) {
cout<<"YES"<<endl;
}
else {
bool redp[n];
memset(redp,false,sizeof redp);
redp[n-1]=true;
for(int i=n-1;i>0;i--) {
for(int j=i-1;j>=max(0,i-k);j--) {
if(redp[i]&&h[j]>=h[i]) {
redp[j]=true;
}
}
}
int f=0;
// 使用超能力
for(int i=0;i<n-1&&f==0;i++) {
if(dp[i]==false) continue;
for(int j=i+1;j<=min(n-1,i+k);j++){
if(redp[j]) {
f=1;
break;
}
}
}
if(f==1) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
return 0;
}
京公网安备 11010502036488号