求子矩阵元素最大和

来源:互联网 发布:c语言布尔类型怎么输出 编辑:程序博客网 时间:2024/05/22 08:09

import java.util.Random;

public class MaxSumMatrix {

 public static void main(String[] args) {
  int[][] p = { { 1, 12, -30 }, { 4, -6, 4 }, { -9, 1, 11 } };
  int[] k = new int[] { -2, 5, -1, 9, 0 };
  Random r = new Random();
  for (int i = 0; i < 5; i++) {
   k[i] = r.nextInt(30) - 15;
   //System.out.print(k[i] + " ");
  }
  //maxSum(k); 
  displayMatrix(p);
   int r2=maxSum2(p,3,3);
   System.out.println(r2);
 }

 private static void displayMatrix(int[][] p) {
  System.out.println("矩阵为:");
   for (int i = 0; i < p.length; i++) {
   for (int j = 0; j < p[i].length; j++) {
    System.out.print(p[i][j] + "/t");
   }
   System.out.println();
  }
 }

 /**
  * 求一个矩阵中的一个子矩阵,使其各元素之和最大为所有子矩阵中最大
  * @param p 二位矩阵
  * @param m 矩阵行
  * @param n 矩阵列
  * @return
  */
 public static int maxSum2(int[][] p, int m, int n) {
  int i, j;
  //子矩阵最大和
  int sum = 0, tsum = 0;
  int[] b = new int[n];
  int[] s = new int[3];
  //确定子矩阵的范围
  //(i1,j1)为子矩阵左上角坐标,(i2,j2)为其右下角坐标
  int i1 = 0, j1 = 0, i2 = 0, j2 = 0;
  
  for (i = 0; i < m; i++) {
   for (int k = 0; k < n; k++)
    b[k] = 0;
   for (j = i; j < m; j++) {
    for (int k = 0; k < n; k++)
     b[k] += p[j][k];
    s = maxSum(b);
    tsum = s[0];

    if (tsum > sum) {
     sum = tsum;
     i1 = i;
     i2 = j;
     j1 = s[1];
     j2 = s[2];
    }
   }
  }
  
  //输出这个子矩阵
  System.out.println("子矩阵为:");
  for (int ix = i1; ix <= i2; ix++) {
   for (int jx = j1; jx <= j2; jx++)
    System.out.print(p[ix][jx] + "/t");
   System.out.println();
  }

  System.out.println("====================");
  //返回子矩阵最大值
  return sum;
 }

 //确定一元数组的最大和
 private static int[] maxSum(int[] b) {
  int len = b.length;
  int[] s = new int[3];
  int i, sum = 0xfffffff0, sum1 = 0;
  //分别为最大和序列的开始和结束位置
  int start = 0, end = 0;
  for (i = 0; i < len; i++) {
   if (sum1 > 0) {
    sum1 += b[i];
   } else {
    sum1 = b[i];
    if (sum1 > 0) {
     start = i;
     end = i;
    }
   }

   if (sum1 > sum) {
    sum = sum1;
    if (sum < 0)
     start = i;
    end = i;    
   }
  }
  //System.out.println(start + "->" + end);
  s[0] = sum;
  s[1] = start;
  s[2] = end;
  //System.out.println(sum);
  
  return s;
 }

}

原创粉丝点击