uva 10285 - Longest Run on a Snowboard

来源:互联网 发布:mac vmware删除win七 编辑:程序博客网 时间:2024/05/16 13:04
import java.io.*;import java.util.*;class node implements Comparable<node>{    int x,y,value;    public node(int a,int b,int c){        x=a;y=b;value=c;    }    @Override    public int compareTo(node t) {        return value - t.value;    }}public class Main{    public static int dfs(int k,int[] dp,node ori[], int step, int a, int b){        if(dp[k]!=0) return dp[k]+1;        int[][] dir = {{-1,0},{0,-1},{1,0},{0,1}};        int max = step;        for(int i=0;i<4;i++){            int new_x = ori[k].x+dir[i][0];            int new_y = ori[k].y+dir[i][1];            if(new_x>=0&&new_x<a&&new_y>=0&&new_y<b){                int tmp = new_x*b+new_y;                if(ori[tmp].value>=ori[k].value) continue;                int temp = dfs(tmp,dp,ori,step+1,a,b);                max = temp>max?temp:max;            }        }        return  max;    }    public static void main(String[] args) throws Exception {        Scanner scan = new Scanner(System.in);        int n = scan.nextInt();        while(n-->0){            String desc = scan.next();            int x = scan.nextInt();            int y = scan.nextInt();            node[] table = new node[x*y];            for(int i=0;i<x;i++){                for(int j=0;j<y;j++){                    table[i*y+j] = new node(i,j,scan.nextInt());                }            }            node[] copy = Arrays.copyOf(table,x*y);            Arrays.sort(table);            int dp[] = new int[x*y];            int max = 1;            for(int i=0;i<table.length;i++){                int index = table[i].x*y+table[i].y;                dp[index] = dfs(index,dp,copy,1,x,y);                max = dp[index]>max?dp[index]:max;            }            System.out.println(desc+": "+max);        }            }}

最开始居然在用BFS写,脑袋不清楚啊TMD,BFS做最短路径的啊,这个如此明显的最长路径,我还在写BFS。。。

代码写了一半发现逻辑错得离谱,然后改DFS.

先按值排序,这样就会从值最小的点开始走,最小的点明显是1, 然后次小的点,路径长可能是1或者2.

这样做到后面的点的时候,比如做到值为20的点,然后这个点相邻的有比他值小的点,比如18, 那么可以确保以18为终点的路长已经被计算过

并且储存在dp这个数组里,那么在深搜的过程中就可以直接返回结果。就是所谓的记忆化搜索?。。。


人生悲剧至此,此题1Y居然是平淡生活中很令人振奋的一刻。。。

上班上的我都快无语了。下班A题还是很累啊,8个小时忙碌的工作后脑袋不灵光,想题的时候感觉脑袋很重。。。

不过这种状态能完全自己做出这题来, 并且1A还是很开心的。

原创粉丝点击