zoukankan      html  css  js  c++  java
  • [POJ1050]To the Max(最大子段和)

    题目链接

    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);
    	}
    }
    
  • 相关阅读:
    class和struct
    类内初始值(c++11)
    默认初始化、值初始化
    聚合类
    对象
    排序算法的比较
    快速排序
    堆排序
    ubunu设置java命令为全局的命令-添加到全局环境变量
    Mina笔记
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/10992108.html
Copyright © 2011-2022 走看看