一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

扫码关注一亩三分地公众号
查看: 2049|回复: 15
收起左侧

[找工就业] Epic OA 的snake sequence怎么解?

[复制链接] |试试Instant~ |关注本帖
基德不爱吃鱼 发表于 2015-3-30 01:46:29 | 显示全部楼层 |阅读模式

2015(1-3月)-[13]EE硕士+fresh grad 无实习/全职 - 网上海投| 码农类全职@Epicfresh grad应届毕业生

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

x
     Snake Sequence
You are given a grid of numbers. A snake sequence is made up of adjacent numbers such that for each number, the number on the right or the number below it is +1 or -1 its value. For example,
1 3 2 6 8
-9 7 1 -1 2. 鍥磋鎴戜滑@1point 3 acres
1 5 0 1 9
In this grid, (3, 2, 1, 0, 1) is a snake sequence. Given a grid, find the longest snake sequences and their lengths (so there can be multiple snake sequences with the maximum length).



如果要打印出snake sequence如何打印?  假如有多条sequence的长度相同的话?
求大神们指点



补充内容 (2015-3-30 02:18):
补充一下  这道题是用DP做的
peace 发表于 2015-4-16 09:57:13 | 显示全部楼层
这题我也是先dp得到以每个点为蛇尾所能达到的最长的长度,然后从最长长度那个点开始找snake,类似word search那种dfs
  1. import java.util.ArrayList;
  2. import java.util.Arrays;

  3. public class SnakeSequence {
  4.         public static void main(String[] args) {
  5.                 int[][] grid = {
  6.                                 {1, 3, 2, 3, 4},
  7.                                 {1, 2, 1, 2, 3}, 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  8.                                 {1, 5, 0, 1, 9}
  9.                 };
  10.                 . 鍥磋鎴戜滑@1point 3 acres
  11.                 ArrayList<String> result = getLongestLength(grid);
  12.                 for (String s : result) {
  13.                         System.out.println(s);
  14.                 }
  15.         }
  16.        
  17.         public static ArrayList<String> getLongestLength(int[][] grid) {. 1point 3acres 璁哄潧
  18.                 int[][] lengthGrid = new int[grid.length][grid[0].length];
  19.                 for (int i = 0; i < grid.length; i++) {
  20.                         for (int j = 0; j < grid[0].length; j++) {
  21.                                 lengthGrid[i][j] = 1;
  22.                         }
  23.                 }
  24.                 .1point3acres缃
  25.                 //initialize the first column
  26.                 for (int i = 1; i < grid.length; i++) {
  27.                         if (Math.abs(grid[i][0] - grid[i - 1][0]) == 1) {
  28.                                 lengthGrid[i][0] = lengthGrid[i - 1][0] + 1;
  29.                         }
  30.                 }
  31.                
  32.                 //initialize the first row
  33.                 for (int j = 1; j < grid[0].length; j++) {
  34.                         if (Math.abs(grid[0][j] - grid[0][j - 1]) == 1) {
  35.                                 lengthGrid[0][j] = lengthGrid[0][j - 1] + 1; 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  36.                         }
  37.                 } 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  38.                
  39.                 for (int i = 1; i < grid.length; i++) {
  40.                         for (int j = 1; j < grid[0].length; j++) {
  41.                                 if (Math.abs(grid[i][j] - grid[i][j - 1]) == 1) {
  42.                                         lengthGrid[i][j] = Math.max(lengthGrid[i][j - 1] + 1, lengthGrid[i][j]);
  43.                                 }
  44.                                 if (Math.abs(grid[i][j] - grid[i - 1][j]) == 1) {
  45.                                         lengthGrid[i][j] = Math.max(lengthGrid[i - 1][j] + 1, lengthGrid[i][j]);
  46.                                 }
    . from: 1point3acres.com/bbs
  47.                         }
  48.                 }
  49.                
  50.                 System.out.println(Arrays.deepToString(lengthGrid));
  51.                 int maxLength = 1;
  52.                 for (int i = 0; i < grid.length; i++) {
  53.                         for (int j = 0; j < grid[0].length; j++) {.鏈枃鍘熷垱鑷1point3acres璁哄潧
  54.                                 if (maxLength < lengthGrid[i][j]) {
  55.                                         maxLength = lengthGrid[i][j];
  56.                                 }
  57.                         }
  58.                 }
  59.                 System.out.println("The max length is " + maxLength); 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  60.                
    . 鍥磋鎴戜滑@1point 3 acres
  61.                 ArrayList<String> result = new ArrayList<>();
  62.                 //to find out the longest snake sequences
  63.                 for (int i = 0; i < grid.length; i++) {
  64.                         for (int j = 0; j < grid[0].length; j++) {
  65.                                 if (lengthGrid[i][j] == maxLength) {
  66.                                         StringBuilder sb = new StringBuilder();
  67.                                         sb.append(grid[i][j]);
  68.                                         findSnakeSequence(i, j, grid, maxLength, sb, result);
  69.                                 }
  70.                         }
  71.                 }
  72.                 return result;
  73.         }
  74.         . more info on 1point3acres.com
  75.         public static void findSnakeSequence(int i, int j, int[][] grid, int length, StringBuilder sb, ArrayList<String> result) {
  76.                 if (sb.length() == length) {
  77.                         result.add(sb.toString());
  78.                         return;
  79.                 }
  80.                
  81.                 if (i - 1 >= 0 && Math.abs(grid[i][j] - grid[i - 1][j]) == 1) {
    . 鍥磋鎴戜滑@1point 3 acres
  82.                         sb.insert(0, grid[i - 1][j]);
  83.                         findSnakeSequence(i - 1, j, grid, length, sb, result);
  84.                         sb.deleteCharAt(0);
  85.                 }
  86.                 . 鍥磋鎴戜滑@1point 3 acres
  87.                 if (j - 1 >= 0 && Math.abs(grid[i][j - 1] - grid[i][j]) == 1) {
  88.                         sb.insert(0, grid[i][j - 1]);. From 1point 3acres bbs
  89.                         findSnakeSequence(i, j - 1, grid, length, sb, result);-google 1point3acres
  90.                         sb.deleteCharAt(0);. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
  91.                 }.1point3acres缃
  92.         }. 1point3acres.com/bbs
  93. }
复制代码
回复 支持 1 反对 0

使用道具 举报

mrno5zzz 发表于 2015-3-30 02:03:47 | 显示全部楼层
用一个List或者Set来存结果, 设置一个max的值代表length。如果走完某一条路发现length大于max,那清空List, 再把这条路加进去。然后继续就好了
回复 支持 反对

使用道具 举报

 楼主| 基德不爱吃鱼 发表于 2015-3-30 02:19:55 | 显示全部楼层
mrno5zzz 发表于 2015-3-30 02:03
用一个List或者Set来存结果, 设置一个max的值代表length。如果走完某一条路发现length大于max,那清空List ...

但是如果用DP做的话 我们一直找最优解  假如在某一点发现往右和往下都是最有(长度相同) 那么路径在这里就分叉了  一个list应该不够吧?
回复 支持 反对

使用道具 举报

mrno5zzz 发表于 2015-3-30 02:49:52 | 显示全部楼层
基德不爱吃鱼 发表于 2015-3-30 02:19
但是如果用DP做的话 我们一直找最优解  假如在某一点发现往右和往下都是最有(长度相同) 那么路径在这里 ...
. visit 1point3acres.com for more.
哦,我是用DFS 做的, 一个List<List<String>> 去存总结果, 一个List<String>去存当前路径, max更新的话就清空List<List<String>>. 你用DP是怎么做的?
回复 支持 反对

使用道具 举报

 楼主| 基德不爱吃鱼 发表于 2015-3-30 02:55:20 | 显示全部楼层
mrno5zzz 发表于 2015-3-30 02:49
哦,我是用DFS 做的, 一个List 去存总结果, 一个List去存当前路径, max更新的话就清空List. 你用DP是 ...

这方法挺好的!能不能share下你的代码
我用DP只能找longest sequence 输出他的length 但是不能打印 所以很纠结。。
回复 支持 反对

使用道具 举报

mrno5zzz 发表于 2015-3-30 03:05:15 | 显示全部楼层
你DP是从右下角往上弄得吧?其实可以做完DP从最大点做DFS, 不满足就返回。. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴

这个是我DFS代码

import java.util.*;. visit 1point3acres.com for more.
public class snakeseq {
        public static List<String> snake(int[][] mat){
                List<String> res = new ArrayList<String>();.鏈枃鍘熷垱鑷1point3acres璁哄潧
                int max=0;.鐣欏璁哄潧-涓浜-涓夊垎鍦
                int count=0;
                StringBuffer path = new StringBuffer();
                for(int ii=0;ii<mat.length;ii++){ 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
                        for(int jj=0;jj<mat[0].length;jj++){
                                path.delete(0, path.length());
                                max=helper(mat, res,path,ii, jj,1,count,max);
                                path.delete(0, path.length());
                                max=helper(mat,res,path,ii,jj,2,count, max);. from: 1point3acres.com/bbs
                        }
                }
                return res;
        }
       
        public static int helper(int[][] mat, List<String> res, StringBuffer path, int r, int c, int type, int count, int max){
                int rows = mat.length;
                int cols = mat[0].length;
                path.append(mat[r][c]);. Waral 鍗氬鏈夋洿澶氭枃绔,
                path.append(',');
                if(r==rows-1&&type==1||c==cols-1&&type==2){
. 1point 3acres 璁哄潧                        if(count==max){
                                path.deleteCharAt(path.length()-1);
                                res.add(path.toString());
                        }else if(count>max){.鐣欏璁哄潧-涓浜-涓夊垎鍦
                                max=count;
                                res.clear();
                                path.deleteCharAt(path.length()-1);
                                res.add(path.toString());
                        }. 鍥磋鎴戜滑@1point 3 acres
                        return max;
                }
                if(type==1){
                        if(Math.abs(mat[r][c]-mat[r+1][c])!=1) return max;
                        else{
                                max=helper(mat, res, new StringBuffer(path), r+1, c, 1, count+1, max);
                                max=helper(mat, res, new StringBuffer(path), r+1, c, 2, count+1, max);
                        }
鏉ユ簮涓浜.涓夊垎鍦拌鍧.                 }else if(type==2){
                        if(Math.abs(mat[r][c]-mat[r][c+1])!=1) return max;
                        else{
                                max=helper(mat, res, new StringBuffer(path), r, c+1, 1, count+1, max);
                                max=helper(mat, res, new StringBuffer(path), r, c+1, 2, count+1, max);
                        }.鏈枃鍘熷垱鑷1point3acres璁哄潧
                }
                return max;-google 1point3acres
        }
        . 1point3acres.com/bbs
        public static void main(String[] args){
                int[][] mat = new int[][]{{4,3,2,6,8},{-9,7,1,-1,2},{1,5,0,1,9}};
                List<String> res = snake(mat);
                Iterator it = res.iterator();
                while(it.hasNext()){
                        System.out.println(it.next());
                }
                System.out.println(res.size());
        }
. 鍥磋鎴戜滑@1point 3 acres}
回复 支持 反对

使用道具 举报

 楼主| 基德不爱吃鱼 发表于 2015-3-30 03:20:22 | 显示全部楼层
mrno5zzz 发表于 2015-3-30 03:05
你DP是从右下角往上弄得吧?其实可以做完DP从最大点做DFS, 不满足就返回。

这个是我DFS代码

我是从左上往右下做的   就是不知道怎么打印多条。。。 先好好研究下你的代码!
回复 支持 反对

使用道具 举报

halfbloon 发表于 2015-3-30 07:32:39 | 显示全部楼层
这难道不是leetcode原题么
回复 支持 反对

使用道具 举报

 楼主| 基德不爱吃鱼 发表于 2015-3-30 09:45:47 | 显示全部楼层
halfbloon 发表于 2015-3-30 07:32
这难道不是leetcode原题么

啊? leetcode哪道题啊  求指点!
回复 支持 反对

使用道具 举报

halfbloon 发表于 2015-3-30 14:19:57 | 显示全部楼层
基德不爱吃鱼 发表于 2015-3-30 09:45 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
啊? leetcode哪道题啊  求指点!

哎呀 搞错了... 这道题应该就是DFS,我把代码发给你吧? 你把邮箱发我。
回复 支持 反对

使用道具 举报

 楼主| 基德不爱吃鱼 发表于 2015-3-30 14:34:52 | 显示全部楼层
halfbloon 发表于 2015-3-30 14:19
哎呀 搞错了... 这道题应该就是DFS,我把代码发给你吧? 你把邮箱发我。

给你发消息啦  多谢啦!! 感觉这道题有点复杂啊。。。。也因为我太水了。。
回复 支持 反对

使用道具 举报

悲伤网管 发表于 2015-4-17 12:41:34 | 显示全部楼层
peace 发表于 2015-4-16 09:57
这题我也是先dp得到以每个点为蛇尾所能达到的最长的长度,然后从最长长度那个点开始找snake,类似word sear ...
-google 1point3acres
我也是这么做的,不知道还有没有更快的方法
回复 支持 反对

使用道具 举报

ldpraymond 发表于 2015-6-11 02:42:58 | 显示全部楼层
DFS应该是正解
回复 支持 反对

使用道具 举报

ldpraymond 发表于 2015-6-11 02:49:26 | 显示全部楼层
看过Berkeley 61B DFS部分,如果自己构建GraphNode,会不会更简洁一些?
回复 支持 反对

使用道具 举报

kanone 发表于 2015-11-19 13:48:39 | 显示全部楼层
如果从左上往右下遍历的话相当于隐性实现了Dynamic Programming,曾经栽在这道题上,如今十倍奉还!. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
. Waral 鍗氬鏈夋洿澶氭枃绔,
  1. """
  2. Analysis:
  3. -google 1point3acres
  4. must traverse all elements so that no one is missed,.鐣欏璁哄潧-涓浜-涓夊垎鍦
  5. calculate paths ending with each element,
  6. store both maximum length and paths in two matrices
  7. . from: 1point3acres.com/bbs
  8. """

  9. import copy

  10. Grid1 = [[1,3,2,6,8],
  11.         [-9,7,1,-1,2],
  12.         [1,5,0,1,9]]
  13.         
  14. Grid2 = [[1,3,2,6,8],
  15.         [-9,7,1,0,2],. 鍥磋鎴戜滑@1point 3 acres
  16.         [1,5,0,1,9]]. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
  17.         

  18. 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  19. def getLongestSnakes(G):

  20.     row = len(G)
  21.     column = len(G[0])   
  22.     . 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
  23.     #must use deepcopy !
  24.     lengths = [copy.deepcopy([0]*column) for i in range(row)]
  25.     paths = [copy.deepcopy([[]]*column) for i in range(row)]
  26.         
  27.     maxlength = 0
  28.    
  29.     #iterate through each element from left to right, top to bottom
  30.     for i in range(len(G)):
  31.         for j in range(len(G[0])):. From 1point 3acres bbs
  32.             getSnakes(G, (i,j), paths, lengths)
  33.             if lengths[i][j] > maxlength:
  34.                 maxlength = lengths[i][j]
  35.     for i in range(len(G)):
  36.         for j in range(len(G[0])):
  37.             if lengths[i][j] == maxlength:
  38.                 print(paths[i][j])
  39.                
  40.                 for p in paths[i][j]:.鐣欏璁哄潧-涓浜-涓夊垎鍦
  41.                     l = []
  42.                     for e in p:
  43.                         l += [G[e[0]][e[1]]]
  44.                     print(l)
  45.    
  46.     print("Length Grid:")
  47.     print(lengths)
  48.     #print("Path Grid:")
  49.     #print(paths)


  50. #get paths of snakes ending with element "end",
  51. #which is a tuple consists of row number and column number. 鍥磋鎴戜滑@1point 3 acres
  52. #this function could be used seperately, which means you can use.鏈枃鍘熷垱鑷1point3acres璁哄潧
  53. #it to calculate any snakes ends with this element "end", and it
  54. #has dynamic programming feature, before doing that you need to initiate P and L.鏈枃鍘熷垱鑷1point3acres璁哄潧
  55. def getSnakes(G, end, P, L):
  56.     x, y = end
  57.    
  58.     #if already calculated, return previous result
  59.     if L[x][y] != 0:.1point3acres缃
  60.         return copy.deepcopy(P[x][y])
  61.    
  62.     result = []   
  63.    
  64.     if x-1 >= 0 and abs(G[x-1][y] - G[x][y]) == 1:
  65.         pathList = getSnakes(G, (x-1, y), P, L)
  66.         
  67.         if L[x][y] <= L[x-1][y] + 1:
  68.             L[x][y] = L[x-1][y] + 1. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
  69.             . 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
  70.             for p in pathList:
  71.                 p += [(x,y)]
  72.         . 鍥磋鎴戜滑@1point 3 acres
  73.             result += pathList
  74.             
  75.     if y-1 >= 0 and abs(G[x][y-1] - G[x][y]) == 1:
  76.         pathList = getSnakes(G, (x, y-1), P, L). more info on 1point3acres.com
  77.         if L[x][y] <= L[x][y-1] + 1:
  78.             L[x][y] = L[x][y-1] + 1 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  79.             
  80.             for p in pathList:
  81.                 p += [(x,y)]
  82.         
  83.             result += pathList
  84.     if len(result) == 0:
  85.         L[x][y] = 1
  86.         P[x][y] = [[(x,y)]]
  87.     else:. From 1point 3acres bbs
  88.         P[x][y] = result
  89.     return copy.deepcopy(P[x][y])
复制代码
回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2016-12-8 12:32

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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