Buttercola: Zenefits: The maximum money
/*一个正方形的矩阵,左上角的位置保证是0,其他的每个坐标位置上都有一个大于等于0的数。
* 一个人最初携带着的钱数为K,然后要从左上角走到右下角,每次只能向右或者向下走,
* 每到一个位置上就需要花掉该位置上对应的钱数,要求编程看看这个人能不能走到右下角,
* 如果不能,就返回-1,如果能,那就要找到一个解法,使得这个人剩余的钱数尽可能少,
* 也就是最终剩余的钱数要大于等于0,并且尽可能接近于0.*/
Read full article from Buttercola: Zenefits: The maximum money
/*一个正方形的矩阵,左上角的位置保证是0,其他的每个坐标位置上都有一个大于等于0的数。
* 一个人最初携带着的钱数为K,然后要从左上角走到右下角,每次只能向右或者向下走,
* 每到一个位置上就需要花掉该位置上对应的钱数,要求编程看看这个人能不能走到右下角,
* 如果不能,就返回-1,如果能,那就要找到一个解法,使得这个人剩余的钱数尽可能少,
* 也就是最终剩余的钱数要大于等于0,并且尽可能接近于0.*/
public int maxCost(int[][] matrix, int cost) { if (matrix == null || matrix.length == 0 || cost <= 0) { return 0; } int m = matrix.length; int n = matrix[0].length; // dp[i][j][k] means the max cost at i,j with cost limit cost int[][][] dp = new int[m][n][cost + 1]; // Initialize the first row for (int j = 1; j < n; j++) { for (int k = 0; k <= cost; k++) { if (k < matrix[0][j]) { dp[0][j][k] = -1; } else { dp[0][j][k] = dp[0][j][k - matrix[0][j]] + matrix[0][j]; } } } // Initialize the first col for (int i = 1; i < m; i++) { for (int k = 0; k <= cost; k++) { if (k < matrix[i][0]) { dp[i][0][k] = -1; } else { dp[i][0][k] = dp[i][0][k - matrix[i][0]] + matrix[i][0]; } } } for (int i = 1; i < m; i++) { for (int j = 1; j < n; j++) { for (int k = 0; k <= cost; k++) { if (i == 0 && j == 0) { dp[i][j][k] = 0; } else if (k < matrix[i][j]) { dp[i][j][k] = -1; } else { int up = dp[i - 1][j][k - matrix[i][j]]; int left = dp[i][j - 1][k - matrix[i][j]]; if (up == -1 && left == -1) { dp[i][j][k] = -1; } else { dp[i][j][k] = Math.max(up, left) + matrix[i][j]; } } } } } return dp[m - 1][n - 1][cost]; }