给出n-1 个ai,i = 2 ~ n ,可以认为a1 = 1~n-1
问对每个i,输出最后y的大小 。 其中操作循环为 1. x+a[x] , y+ a[x] 2. x- a[x] , y+a[x] 。
退出条件为x>n 或 x<0
明显是记忆化搜素, 需要记忆操作的方向 。可以借助y每次总是+a[x]的性质简化代码
用vis数组来标记是否搜索到该状态,若曾搜索到且dp==0 直接返回 -1 即可
ll dp[maxn][2]; int vis[maxn][2]; int a[maxn]; int n; ll dfs(int x, int dir) { if (x <= 0 || x > n) return 0; if (~dp[x][dir]) return dp[x][dir]; if (vis[x][dir]) return -1; vis[x][dir] = 1; ll res = dfs(dir ? x + a[x] : x - a[x], dir ^ 1); return dp[x][dir] = (res < 0 ? -1 : res + a[x]); } int main() { scanf("%d", &n); memset(dp, -1, sizeof dp); for (int i = 2; i <= n; i++) scanf("%d", a + i); for (int i = 2; i <= n; i++) { ll tmp = dfs(i, 0); printf("%I64d\n", tmp < 0 ? -1 :i + tmp - 1); } }