/**
* 1. 一个矩阵,每个元素都是个正整数,从左上角到右下角,只能向下走或者向右走,问最大得分。
*
* 2. 如果给一个限定值为max, 求可能的最大得分,该得分不能超过max。
* 参考ArrayDivide, 该问题是一维,本问题是二维。
*
*
*/
public class MatrixValue {
// Q1
public static int find(int[][] a, int m, int n){
assert(true);
int[][] b = new int[m][n];
b[0][0] = a[0][0];
for(int i=1; i<m; i++){
b[i][0] = a[i][0] + b[i-1][0];
b[0][i] = a[0][i] + b[0][i-1];
}
for(int i=1; i<m; i++){
for(int j=1; j<n; j++){
int pre = b[i-1][j]>b[i][j-1] ? b[i-1][j] : b[i][j-1];
b[i][j] = pre + a[i][j];
}
}
Tools.printArray(b);
return b[m-1][n-1];
}
//Q2
public static int find(int[][] a, int m, int n, int max){
assert(true);
boolean[][][] b = new boolean[m][n][max+1];
int x = a[0][0];
b[0][0][x] = true;
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
for(int k=1; k<=max; k++){
if(a[i][j] < k){
if(j>0 && b[i][j-1][k-a[i][j]]){
b[i][j][k] = true;
}
if(i>0 && b[i-1][j][k-a[i][j]]){
b[i][j][k] = true;
}
}
}
}
}
for(int l=max; l>0; l--){
if(b[m-1][n-1][l]){
return l;
}
}
return -1;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[][] a = {{1,2,3},{4,5,6},{7,8,9}};
int max = MatrixValue.find(a, a.length, a[0].length);
System.out.println();
System.out.println(max);
//Q2
max = MatrixValue.find(a, a.length, a[0].length, 26);
System.out.println("---------------------");
System.out.println(max);
}
}
杨氏矩阵
最新推荐文章于 2024-09-12 17:03:06 发布
2535

被折叠的 条评论
为什么被折叠?



