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);
        }
    }
  • 相关阅读:
    字节对齐方法
    以太网帧、IP报文格式
    单光纤udp通信
    错误笔记(1)——关于克隆虚拟机引发的后续问题
    linux 查看目录名称的方法
    rpm方式安装MySQL-5.6
    克隆虚拟机后修改MAC地址
    安卓反编译一些记录
    mysql日志
    Linux文件监控工具——inotify-tools
  • 原文地址:https://www.cnblogs.com/zwx7616/p/12256740.html
Copyright © 2011-2022 走看看