avatar
这题怎么做?# JobHunting - 待字闺中
m*a
1
N*N矩阵,矩阵的元素可正可负。请找出该矩阵的一个子矩阵(方块),使得其所有元
素之和在所有子矩阵中最大。
这个有O(N^3) 的DP解?网上搜出来的好像不对。
avatar
i*r
2
O(n^3)的dp
1.枚举前后两行,O(n^2)
2.求最大子段和,O(n)
avatar
m*a
3
能展开讲讲吗?怎么枚举前后“两行”?
avatar
m*a
4
能展开讲讲吗?怎么枚举前后“两行”?
avatar
i*r
5
google搜“最大子矩阵和”
就知道了
avatar
m*a
6
Got it. thanks.
avatar
j*b
7
public static void main(String[] args) {
int[][] matrix = { { -1, -2, -3 }, { 4, 5, -6 }, { -7, -8, -9 } };
int n = 3;
int sum[][][] = new int[n][n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
sum[i][j][j] = matrix[i][j];
}
for (int j = 1; j < n; j++) {
for (int k = 0; k < n - j; k++) {
//dp
sum[i][k][k + j] = sum[i][k][k] + sum[i][k + 1][k + j];
}
}
}
Integer Max = null;
// find the biggest
int a1 = 0, a2 = 0, b1 = 0, b2 = 0;
for (int b = 0; b < n; b++) {
for (int c = b; c < n; c++) {
int s = 0;
Integer max = null;
int maxs = 0, maxe = 0;
int start = 0;
for (int a = 0; a < n; a++) {
s += sum[a][b][c];
if (max == null || s > max) {
max = s;
maxs = start;
maxe = a;
}
if (s <= 0) {
start = a + 1;
s = 0;
}
}
if (Max == null || max > Max ) {
Max = max;
a1 = maxs;
a2 = maxe;
b1 = b;
b2 = c;
}
}
}
System.out.println("row " + a1 + "-" + a2);
System.out.println("col " + b1 + "-" + b2);
System.out.println("sum " + Max);
}
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。