分析:如果直接用暴力法,时间复杂度可以达到0(*)
但行用到dp的方法可以将时间复杂度降到O(*n)
public class Main {
public static int a[][] = {
{1,1,1,1,1,1},
{1,0,0,0,1,1},
{1,0,0,0,1,1},
{1,0,0,0,1,1},
{1,0,-10,0,1,1},
{1,1,1,1,1,1}
};
public static int N = a.length;
public static void main(String[] args) {
findMaxsonAj();
}
private static void findMaxsonAj() {
int max = -1000000 ;
for(int i = 0; i < N;i ++) {//上边界
int b[][] = new int[N][N];
//将a复制到b中
for(int k1 = 0; k1 < N;k1 ++) {
for(int k = 0; k < N; k ++) {
b[k1][k] = a[k1][k] ;
}
}
for(int k = i; k < N; k ++) {//下边界
int sumt = 0;
if(k > i) {
for(int j = 0; j < N; j ++) {
b[k][j] += b[k - 1][j] ;
}
}
//查找当处理行的最大连续和(使用dp的思想)
for(int j = 0; j < N; j ++) {
if(b[k][j] + sumt >= 0) {
sumt += b[k][j];
if(sumt > max) {
max = sumt;
}
}
else {
sumt = 0;
}
}
}
for(int k1 = 0; k1 < N;k1 ++) {
for(int k2 = 0; k2 < N; k2 ++) {
System.out.print(b[k1][k2] + " ");
}
System.out.println();
}
System.out.println();
}
System.out.println(max);
}
}
运行结果:
1 1 1 1 1 1
2 1 1 1 2 2
3 1 1 1 3 3
4 1 1 1 4 4
5 1 -9 1 5 5
6 2 -8 2 6 6
1 1 1 1 1 1
1 0 0 0 1 1
2 0 0 0 2 2
3 0 0 0 3 3
4 0 -10 0 4 4
5 1 -9 1 5 5
1 1 1 1 1 1
1 0 0 0 1 1
1 0 0 0 1 1
2 0 0 0 2 2
3 0 -10 0 3 3
4 1 -9 1 4 4
1 1 1 1 1 1
1 0 0 0 1 1
1 0 0 0 1 1
1 0 0 0 1 1
2 0 -10 0 2 2
3 1 -9 1 3 3
1 1 1 1 1 1
1 0 0 0 1 1
1 0 0 0 1 1
1 0 0 0 1 1
1 0 -10 0 1 1
2 1 -9 1 2 2
1 1 1 1 1 1
1 0 0 0 1 1
1 0 0 0 1 1
1 0 0 0 1 1
1 0 -10 0 1 1
1 1 1 1 1 1
15