我有一个nxm矩阵,我需要在不同的行和列中找到其值的最大值。
例如,考虑以下矩阵:
m1 m2 m3
n1 1 2 3
n2 4 5 6
n3 7 8 9
n4 10 11 12
最大值为12 + 8 + 4 = 24
请注意,查找max并删除属于该列或行的所有值不是一个好的解决方案,因为它不适用于所有情况。
以上例外情况如下:
m1 m2
n1 17 1
n2 18 15
如果找到18并删除17和15,则总和将为18 + 1 = 19.而17 + 15 = 32具有更高的值。
对这个问题的算法有什么看法吗?
答案 0 :(得分:3)
解决方案是使用匈牙利算法。这是一个复杂的算法。在youtube上有一个非常好的讲座:
答案 1 :(得分:0)
这类似于N皇后问题,我们必须将N皇后放置在N * N矩阵中,以使2皇后不应该在同一列或同一行中。
import java.util.Vector;
public class maxSum {
private static int getMaxSum(int row, int[] col, int n, int[][] mat, int sum,
Vector<Integer> ans) {
if(row >= n) {
System.out.println(ans+"->"+sum);
return sum;
}
int max = Integer.MIN_VALUE;
for(int i=0;i<n;i++) {
if(col[i]==1)
continue;
col[i] = 1;
ans.add(mat[row][i]);
max = Math.max(getMaxSum(row+1,col,n,mat,sum+mat[row][i],ans), max);
ans.remove(ans.size()-1);
col[i] = 0;
}
return max;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[][] mat = {{2,5,7,6},{8,5,11,9},{7,3,1,2},{8,7,9,7}};
int n = 4;
int col[] = {0,0,0,0};
Vector<Integer> ans = new Vector<Integer>();
System.out.println(getMaxSum(0,col,n,mat,0,ans));
}
}