简单易懂
小猿的迷宫之旅
http://www.nowcoder.com/questionTerminal/841daaca3868485ea1924bf3fc3f2e8f
一句话总结:
深度优先遍历的时候使用三维数组保存每个点还剩按钮次数k时可以走的最大值
import java.util.Scanner; /** * @author rafa gao */ public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int a = scanner.nextInt(); int b = scanner.nextInt(); // 按钮次数 int k = scanner.nextInt(); int[][] nums = new int[a][b]; for (int i = 0; i < a; i++) { for (int j = 0; j < b; j++) { nums[i][j] = scanner.nextInt(); } } int[][][] dp = new int[a][b][k+1]; int max = 0; for (int i = 0; i < a; i++) { for (int j = 0; j < b; j++) { max = Math.max(max, help(nums, k, dp, i, j, Integer.MIN_VALUE)); } } System.out.println(max); } private static int help(int[][] nums, int k,int[][][] dp,int a,int b,int last) { int aL = nums.length; int bL = nums[0].length; if (a < 0 || a >= aL || b < 0 || b >= bL) { return 0; } // 更小 int temp; if ((temp = nums[a][b]) <= last) { if (k == 0) { return 0; } k--; } if (dp[a][b][k] != 0) { return dp[a][b][k]; } int max = help(nums, k, dp, a - 1, b, temp); max = Math.max(max, help(nums, k, dp, a + 1, b, temp)); max = Math.max(max, help(nums, k, dp, a, b - 1, temp)); max = Math.max(max, help(nums, k, dp, a, b + 1, temp)); max++; dp[a][b][k] = max; return max; } }