这是一道神奇的题,题意是这样(抽象过后),你刚开始在0的位置,现在你在第i个位置,你可以走到底i+a[i]的位置,又或者说走到 j 的位置(j的条件是 j - a[j] - 1的这个位置是可以走到的)然后最后你能否走到n的位置。很标准的dp,只是多加了一个判断而已
题目:
ac代码(dp的代码真的很短,但是也是真地难想)
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 2e5 + 10;
typedef long long int LL ;
LL a[N];
int st[N];
int main()
{
ios :: sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while(t--)
{
int n;
cin >> n ;
for(int i = 1 ; i <= n ; i ++)
cin >> a[i],st[i] = false;
st[0] = true;
for(int i = 1; i <= n ; i ++)
{
if(st[i-1])
{
int j = a[i] + i ;
if(j <= n )st[j] = true;
}
int j = i - a[i] - 1;
if(j >= 0 && st[j])st[i] = true;
}
if(st[n])cout <<"YES"<<endl;
else cout <<"NO"<<endl;
}
return 0 ;
}