Codeforces Round #751 D Frog Traveler(dp)
Solution
我们先将跳跃的步骤转换一下,
即 将每次先跳到一个点,然后滑一段距离
看作 每次先滑下一段距离,再向上跳一段距离
参考:知乎https://zhuanlan.zhihu.com/p/425837640
代码
#include <algorithm>
#include <cmath>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stdio.h>
#include <string.h>
#include <string>
#include <vector>
//#define int long long
#define lowbit(x) ((x) & (-x))
using namespace std;
typedef pair<int, int> pii;
typedef pair<long, long> pll;
typedef pair<double, int> pdi;
typedef double dd;
typedef long long ll;
const int MAXN = 300010;
const int MAXM = 3000010;
const dd eps = 1e-6;
const int inf = 0x3f3f3f3f;
const ll llinf = 0x3f3f3f3f3f3f3f3f;
int a[MAXN], b[MAXN], dp[MAXN], fa[MAXN];
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n;i++)
cin >> a[i];
for (int i = 1; i <= n;i++)
cin >> b[i];
int last = n;
queue<int> q;
q.push(n);
while(q.size())
{
int u = q.front();
q.pop();
int v = u + b[u];
if (v - a[v] <= 0)
{
vector<int> ans;
ans.push_back(0);
int now = u;
while(now!=n)
ans.push_back(now), now = fa[now];
reverse(ans.begin(), ans.end());
printf("%d\n", ans.size());
for(int i:ans)
printf("%d ", i);
printf("\n");
return 0;
}
for (int i = min(v, last - 1); i >= v - a[v]; i--)
{
dp[i] = dp[u] + 1;
fa[i] = u;
q.push(i);
}
last = min(v - a[v], last);
}
printf("-1\n");
}