简单易懂

小猿的迷宫之旅

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;
    }
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务