Sending a Sequence Over the Network
题意传送门<洛谷>
思路:
看标签很唬人...就一个dp,所以 一直在想怎么用dp处理,可以想到的是有两种状态,(1)bi中包含ai子段长度(2)bi中不包含ai字段长度,,但想了很久也没做出来,最后经过队里大佬指点....
“把这个想象成n个青蛙在石头上跳,第a[i]个石头可以选择想后跳a[i]个距离,然后n个向前跳,n个向后跳,只要存在一条路径能到达第n个位置就行”
妙不可言...下面是代码实现:
#include <bits/stdc++.h>
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int t;
std::cin >> t;
while (t--) {
int n;
std::cin >> n;
std::vector<int> a(n);
std::vector<int> vis(n + 1, 0);
for (int &ai : a){
std::cin >> ai;
}
vis[0] = 1;
for(int i = 0; i <= n; i++){
if(i) {
int j = i - a[i - 1] - 1;
if(j >= 0) vis[i] |= vis[j];
}
if(i < n) {
int j = i + a[i] + 1;
if(j <= n) vis[j] |= vis[i];
}
}
std::cout << (vis.back() ? "YES\n": "NO\n");
}
return 0;
}