首页 > 代码库 > POJ 1050 To the Max 最详细的解题报告
POJ 1050 To the Max 最详细的解题报告
题目来源:To the Max
题目大意:给定一个N*N的矩阵,求该矩阵中的某一个矩形,该矩形内各元素之和最大,即最大子矩阵问题。
解题方法:最大子序列之和的扩展
解题步骤:
1、定义一个N*N的矩阵state,state[j][k]用来存放矩阵的某行中第j到k个元素的最大值;
2、对于行如何处理呢?我们可以将第一行中的N个元素的所有组合的最大值存放在state中,如果有哪个值小于0,清零,因为它没有做任何贡献;定计算第二行时与第一行的值(全部大于等于0)进行累加,这样就完成了第一行与第二行的累加,即计算一个2行的子矩阵,依次类推。
具体算法(java版,可以直接运行)
1 static int maxValue(int[][] array, int size) { 2 int max = Integer.MIN_VALUE; 3 int[][] state = new int[size][size]; 4 for (int i = 0; i < size; i++) { // 第i行 5 for (int j = 0; j < size; j++) {// 第j列 6 int sum = 0; 7 for(int k=j;k<size;k++){// 第k列 8 sum+=array[i][k]; //计算从i到k的值 9 state[j][k] += sum;10 if (state[j][k] > max) {11 max = state[j][k];12 }13 if(state[j][k]<0){ //没有做贡献,清零14 state[j][k]=0;15 }16 }17 }18 }19 return max;20 }21 public static void main(String[] args) {22 Scanner input = new Scanner(System.in);23 int size = input.nextInt();24 int[][] array = new int[size][size];25 for (int i = 0; i < size; i++) {26 for (int j = 0; j < size; j++) {27 array[i][j] = input.nextInt();28 }29 }30 System.out.println(maxValue(array, size));31 }
为了方便理解,贴出state中值得变化情况:
数据:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
i=0时state中的值(由于第一行所有的值都不大于0,所以全部为0):
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
i=1时state中的值:
9 11 5 7
0 2 0 0
0 0 0 0
0 0 0 2
i=2时state中的值:
5 8 0 1
0 3 0 0
0 0 0 0
0 0 0 3
i=3时state中的值:
4 15 7 6
0 11 8 6
0 0 0 0
0 0 0 1
如果有什么更好地解决方案,希望大家可以一起分享!
POJ 1050 To the Max 最详细的解题报告
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。