简单易懂
小猿的迷宫之旅
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;
}
}