zoukankan      html  css  js  c++  java
  • 最大子阵 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);
        }
    }
  • 相关阅读:
    bzoj3993: [SDOI2015]星际战争
    bzoj3583: 杰杰的女性朋友 && 4362: Graph
    bzoj2260: 商店购物 && 4349: 最小树形图
    老oj3444 && Pku3241 Object Clustering
    bzoj3754: Tree之最小方差树
    bzoj2215: [Poi2011]Conspiracy
    老oj曼哈顿最小生成树
    bzoj2180: 最小直径生成树
    棋盘问题
    油田 Oil Deposits
  • 原文地址:https://www.cnblogs.com/zwx7616/p/12256740.html
Copyright © 2011-2022 走看看