码迷,mamicode.com
首页 > 其他好文 > 详细

[POJ1050]To the Max(最大子段和)

时间:2019-06-09 00:52:35      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:复杂   直接   main   没有   数组   imp   port   ext   rgs   

题目链接

http://poj.org/problem?id=1050

题意

求最大子矩阵和。

题解

  • 即求二维的最大子段和。二维数组sumRec[I][j]存储原始数组数据rec[0][j] to rec[I][j]。那么sum[k][j]-sum[I][j]即表示从I+1到k行的第j列这一列的元素和。然后再遍历j,就变成了求一维子段和的问题。共三重循环,时间复杂度O(n^3) 。
  • 求一维最大子段和方法:每遍历一个元素,先判断之前元素的累加和若为负,则直接舍去前面的所有累加元素,因为对和更大没有好处,和更新为0。累加和加上当前元素,并把当前累加和与最大累加和比较,更大则替换。

代码

import java.util.Scanner;

public class Main {
    public static void main(String args[]) {
        Scanner in=new Scanner(System.in);
        int n=in.nextInt();
        int[][] sumRec=new int[n+1][n+1];
        for(int i=0;i<n;++i) {
            for(int j=0;j<n;++j) {
                sumRec[i][j]=in.nextInt();
                if(i!=0) {
                    sumRec[i][j]+=sumRec[i-1][j];
                }
            }
        }
        
        int maxSum=Integer.MIN_VALUE;
        for(int i=0;i<n;++i) {
            for(int k=i;k<n;++k) {
                int sum=0;
                for(int j=0;j<n;++j) {
                    if(sum<0) {
                        sum=0;
                    }
                    sum+=sumRec[k][j]-sumRec[i][j];
                    if(maxSum<sum) {
                        maxSum=sum;
                    }
                }
            }
        }
        System.out.println(maxSum);
    }
}

[POJ1050]To the Max(最大子段和)

标签:复杂   直接   main   没有   数组   imp   port   ext   rgs   

原文地址:https://www.cnblogs.com/coding-gaga/p/10992108.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!