240
功不唐捐,玉汝于成😡。

最大子阵 DP or 前缀和orb暴力 能过

在一个给定的n*m二维矩阵中求一个子矩阵元素和的最大值。

思路:

1:一个二维矩阵由两个点可以确定,枚举两个点,取子矩阵最大值。

2:在一维矩阵中,求一个序列的最大子段,利用 f[i]=max(f[i-1]+a[i],a[i]); f[i]代表以i为尾的字段最大的和,a[i]代表 i此处值。 当求二维子阵的时候,因为是相邻的行和列组成矩阵,所以可以枚举连续的行或者列求和为一位子序列然后又转化为求一维的最大子段。枚举使用O(N^2),求解O(N),综合为为O(N^3); 

在求连续的行中计算每列和可以采用每列一维前缀和或者开一个数组来记。

import java.util.*;
public class Main {
    public static void main (String[]args){
        Scanner s=new Scanner(System.in);
        final int N=10005;
        int[][] dp=new int[N][N];
        int[] r = new int[N];
        int n=s.nextInt(),m=s.nextInt();
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                dp[i][j]=s.nextInt();
        int sum=0;
        for(int i=1;i<=n;i++)
        {
            Arrays.fill(r,0);
            for(int j=i;j<=n;j++)
            {
                int num=0;
                for(int k=1;k<=m;k++)
                {
                    r[k]+=dp[j][k];
                    if(num<0)num=r[k];
                    else num+=r[k];
                    sum=Math.max(sum,num);
                }
            }
            
        }
        System.out.println(sum);
    }
}

 

posted @ 2020-02-03 18:47  BigXun  阅读(226)  评论(0编辑  收藏  举报