CF174 div1 B. Cow Program 记忆化搜索

给出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);
    }
}

猜你喜欢

转载自www.cnblogs.com/hznumqf/p/13194511.html