最大方子阵与最大和子矩阵--Java语言

来源:互联网 发布:淘宝售后外包 编辑:程序博客网 时间:2024/04/29 19:57

本文主要讲的是关于矩阵的子方阵问题,典型题型有:所有元素为1的最大子方阵、最大和子矩阵。

首先先讲述的是所有元素为1的最大子方阵。可以利用动态规划方法求解该问题。用B[m][n]表示二元矩阵。算法的思想是构造一个临时矩阵res[][],其中res[i][j]表示包括B[i][j]在内的值全为1的子方阵的大小,B[i][j]是该子方阵最右下角的元素。因此,初始时,res第一行与第一列的值即为B矩阵第一行与第一列的值。然后遍历B[i][j],判断B[i][j],如果B[i][j]=0,则res[i][j]=0,否则res[i][j]的值跟res[i-1][j-1]、res[i-1][j]、res[i][j-1]有关,取三者最小值加1.

代码实现:

import java.util.*;public class MatrixWithAllOnes {public static void matrixWithAllOnes(int[][]B,int m,int n){int[][] res=new int[m][n];int max_of_s,max_i,max_j;for(int i=0;i<m;i++)res[i][0]=B[i][0];for(int j=0;j<n;j++)res[0][j]=B[0][j];for(int i=1;i<m;i++){for(int j=1;j<n;j++){if(B[i][j]==1)res[i][j]=Math.min(res[i][j-1], Math.min(res[i-1][j-1], res[i-1][j]))+1;//取三者最小值,为了保证是方阵。elseres[i][j]=0;}}max_of_s=res[0][0];max_i=0;max_j=0;for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(res[i][j]>max_of_s){max_of_s=res[i][j];max_i=i;max_j=j;}}}System.out.println("Maximum sub-matrix");for(int i=max_i-max_of_s+1;i<=max_i;i++){for(int j=max_j-max_of_s+1;j<=max_j;j++)System.out.print(B[i][j]+" ");System.out.println();}System.out.println("所有元素为1的最大子方阵的大小:");System.out.println(max_of_s+"x"+max_of_s);}public static void main(String[] args) {// TODO Auto-generated method stubScanner sc=new Scanner(System.in);System.out.println("输入矩阵大小:");String[] str=sc.nextLine().split(" ");int m=Integer.parseInt(str[0]);int n=Integer.parseInt(str[1]);int[][] B=new int[m][n];int k=0;System.out.println("输入原矩阵:");while(k<m&&sc.hasNextLine()){String[] str1=sc.nextLine().split(" ");for(int i=0;i<str1.length;i++)B[k][i]=Integer.parseInt(str1[i]);k++;}System.out.println("所有元素为1的最大子方阵:");matrixWithAllOnes(B,m,n);}}

测试结果:

输入矩阵大小:6 5输入原矩阵:0 1 1 0 11 1 0 1 00 1 1 1 01 1 1 1 01 1 1 1 10 0 0 0 0所有元素为1的最大子方阵:Maximum sub-matrix1 1 1 1 1 1 1 1 1 所有元素为1的最大子方阵的大小:3x3
接着讲述关于最大和子矩阵的问题。
代码实现:

public class FindMaximumSubMatrix {public static void findMaximumSubMatrix(int[][] A,int n){int[][] M=new int[n][n];for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(j==0)M[j][i]=A[j][i];elseM[j][i]=A[j][i]+M[j-1][i];}}int maxSoFar=0;int min,subMatrix;for(int i=0;i<n;i++){for(int j=i;j<n;j++){min=0;subMatrix=0;for(int k=0;k<n;k++){if(i==0)subMatrix+=M[j][k];elsesubMatrix+=M[j][k]-M[i-1][k];if(subMatrix<min)min=subMatrix;if((subMatrix-min)>maxSoFar){maxSoFar=subMatrix-min;}}}}System.out.println(maxSoFar);}public static void main(String[] args) {// TODO Auto-generated method stubint[][] A= {{0,-2,-7,0},{9,2,-6,2},{-4,1,-4,1},{-1,8,0,-2}};int n=A.length;findMaximumSubMatrix(A,n);}}

测试结果:

15


原创粉丝点击