[POJ1050]To the Max(最大子段和)
Posted coding-gaga
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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);
以上是关于[POJ1050]To the Max(最大子段和)的主要内容,如果未能解决你的问题,请参考以下文章