📣 独立日限时特惠: VIP通行证立减$68
12
返回列表 发新帖
楼主: liuqi627
跳转到指定楼层
上一主题 下一主题
收起左侧

Snapcaht 7.19新鲜电面

🔗
何打发123 2016-7-22 08:27:49 | 只看该作者
全局:
谎言之躯 发表于 2016-7-22 06:22
我觉得输出path的话,不用DP,用backtracking就行,DFS时每次访问一个点,就把当前点加入一个记录路径的 ...

按照您的指导  俺又写了一个 但是觉得dp能加快速度 免去了不必要的dfs >.< 再次求指导~~ 哈哈 您约得什么时候的面试呀?
  1. int money = Integer.MAX_VALUE;
  2.         ArrayList<Point> path = new ArrayList<Point>();
  3.        
  4.         public ArrayList<Point> minCostPath(int[][] matrix){
  5.                 if(matrix == null || matrix.length == 0) return path;
  6.                
  7.                 int[][] cost = new int[matrix.length][matrix[0].length];
  8.                 for(int i = 0; i < cost.length; i++){
  9.                         Arrays.fill(cost[i], Integer.MAX_VALUE);
  10.                 }
  11.                
  12.                
  13.                 boolean[][] visited = new boolean[matrix.length][matrix[0].length];
  14.                 ArrayList<Point> temp = new ArrayList<Point>();
  15.                 dfs3(matrix, cost, visited, 0, 0, 0, temp);
  16.                
  17.                 return path;

  18.         }
  19.        
  20.         private void dfs3(int[][] matrix, int[][] cost, boolean[][] visited, int x, int y, int cur, ArrayList<Point> temp){
  21.                 if(x < 0 ||x >= matrix.length || y < 0 || y >= matrix[0].length || visited[x][y] == true) return;
  22.                
  23.                 if(cur >= cost[x][y]) return;
  24.                
  25.                 visited[x][y] = true;
  26.                 cost[x][y] = cur;
  27.                 temp.add(new Point(x, y));
  28.                
  29.                 if(matrix[x][y] == 9){
  30.                         //System.out.println(money);
  31.                         //money = Math.min(cur, money);
  32.                         money = cur;
  33.                         path = new ArrayList<Point>(temp);
  34.                 }else{
  35.                          if(matrix[x][y] == 5){
  36.                         //cost[x][y] = Math.min(cost[x][y], cur + 1);
  37.                                 cost[x][y] = cur + 1;
  38.                         }
  39.         //        System.out.println(x + " " + y + " " + cost[x][y]);
  40.                         int[] surroundx = new int[]{-1, 1, 0, 0};
  41.                         int[] surroundy = new int[]{0, 0, -1, 1};
  42.                
  43.                         for(int i = 0; i < 4; i++){
  44.                                 dfs3(matrix, cost, visited, x + surroundx[i], y + surroundy[i], cost[x][y], temp);
  45.                         }
  46.                 }
  47.                 visited[x][y] = false;
  48.                 temp.remove(temp.size() - 1);
  49.                
  50.         }
复制代码
回复

使用道具 举报

全局:
何打发123 发表于 2016-7-22 08:27
按照您的指导  俺又写了一个 但是觉得dp能加快速度 免去了不必要的dfs >.< 再次求指导~~ 哈哈 您约得什么 ...

这个visited数组是不是没有必要加? 直接用cost矩阵不就行了?
回复

使用道具 举报

🔗
liurudahai 2016-11-7 09:35:42 | 只看该作者
全局:
何打发123 发表于 2016-7-22 00:45
自己写了一个 不知道对不对~各位求指正~

matrix = 9和matrix = 5这些都是怎么来的?
回复

使用道具 举报

🔗
liurudahai 2016-11-7 09:45:48 | 只看该作者
全局:
何打发123 发表于 2016-7-22 08:27
按照您的指导  俺又写了一个 但是觉得dp能加快速度 免去了不必要的dfs >.< 再次求指导~~ 哈哈 您约得什么 ...

感觉还是有问题,你访问过一个节点,就把他的VISITED设置成TRUE了,然后同时更新COST,下一次再访问,VISITED 已经是TRUE了,直接就RETURN了,那你那个更新COST的代码根本不会访问了吧,感觉VISITED没有必要,直接利用COST那个数组来控制,如果现在的COST(CUR)大于等于DP的值,就RETURN,不然就更新
回复

使用道具 举报

🔗
何打发123 2016-11-7 10:28:37 | 只看该作者
全局:
liurudahai 发表于 2016-11-7 09:45
感觉还是有问题,你访问过一个节点,就把他的VISITED设置成TRUE了,然后同时更新COST,下一次再访问,VIS ...

sorry..太久了实在不记得当时候怎么想的了。。  T T  你明白就好啦~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表