zoukankan      html  css  js  c++  java
  • CodeForces 283B 记忆化搜索

    //搜啊搜...

    //因为我们每次搜索的起点都是一样的,但是数组的第一个元素不同,所以可以手工算出下一个点,从起点的下一点开始搜

     1 #include "iostream"
     2 #include "cstdio"
     3 #include "cstring"
     4 #include "algorithm"
     5 using namespace std;
     6 __int64 dp[200010][2];
     7 bool vis[200010][2];
     8 int n, ans[200010];
     9 
    10 __int64 dfs(int x, int chi)
    11 {
    12     if(x <= 0 || x > n)
    13         return 0;
    14     if(dp[x][chi])
    15         return dp[x][chi];
    16     if(vis[x][chi])
    17         return dp[x][chi] = -1;
    18     vis[x][chi] = 1;
    19     __int64 tmp = dfs(x + ((chi)? ans[x]: -ans[x]), chi^1);
    20     if(tmp != -1)
    21         return dp[x][chi] = ans[x] + tmp;
    22     return dp[x][chi] = -1;
    23 }
    24 
    25 int main()
    26 {
    27     int i;
    28     scanf("%d", &n);
    29     for(i = 2; i <= n; ++i)
    30         scanf("%d", &ans[i]);
    31     __int64 tmp;
    32     vis[1][1] = 1;
    33     for(i = 1; i <= n - 1; ++i) {
    34         //ans[1] = i;
    35         tmp = dfs(1 + i, 0);
    36         printf("%I64d
    ", (tmp != -1)? tmp + i: tmp);
    37     }
    38 }

    //从起点开始搜的话,每次维护一下数组第一个元素的值和起点的出入栈标记就好了

     1 #include "iostream"
     2 #include "cstdio"
     3 #include "cstring"
     4 #include "algorithm"
     5 using namespace std;
     6 __int64 dp[200010][2];
     7 bool vis[200010][2];
     8 int n, ans[200010];
     9 
    10 __int64 dfs(int x, int chi)
    11 {
    12     if(x <= 0 || x > n)
    13         return 0;
    14     if(dp[x][chi])
    15         return dp[x][chi];
    16     if(vis[x][chi])
    17         return dp[x][chi] = -1;
    18     vis[x][chi] = 1;
    19     __int64 tmp = dfs(x + ((chi)? ans[x]: -ans[x]), chi^1);
    20     if(tmp != -1)
    21         return dp[x][chi] = ans[x] + tmp;
    22     return dp[x][chi] = -1;
    23 }
    24 
    25 int main()
    26 {
    27     int i;
    28     scanf("%d", &n);
    29     for(i = 2; i <= n; ++i)
    30         scanf("%d", &ans[i]);
    31     __int64 tmp;
    32     for(i = 1; i <= n - 1; ++i) {
    33         ans[1] = i;
    34         dp[1][1] = vis[1][1] = 0;   //确保能够进入搜索起点
    35         tmp = dfs(1, 1);
    36         printf("%I64d
    ", tmp);
    37     }
    38 }
  • 相关阅读:
    Java数据结构概述·14
    Java之自定义异常·13
    idea spirng项目jsp页面乱码
    HashMap和LinkedHashMap的区别
    jar包导入仓库中
    后台接口接受前端参数的时候使用包装类和基本类型接受
    转 为什么程序员怕改需求?
    thymeleaf常用标签
    linux查看端口占用情况
    查询linux硬件配置
  • 原文地址:https://www.cnblogs.com/AC-Phoenix/p/4295860.html
Copyright © 2011-2022 走看看