子阵最大累加和(dp)

 分析:如果直接用暴力法,时间复杂度可以达到0(n^{2}*n^{2})

            但行用到dp的方法可以将时间复杂度降到O(n^{2}*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

猜你喜欢

转载自blog.csdn.net/qq_42794545/article/details/89419997