最大子矩阵
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
给定一个NxM的矩阵A和一个整数K,小Hi希望你能求出其中最大(元素数目最多)的子矩阵,并且该子矩阵中所有元素的和不超过K。
输入
第一行包含三个整数N、M和K。
以下N行每行包含M个整数,表示A。
对于40%的数据,1 <= N, M <= 10
对于100%的数据,1 <= N, M <= 250 1 <= K <= 2147483647 1 <= Aij <= 10000
输出
满足条件最大的子矩阵所包含的元素数目。如果没有子矩阵满足条件,输出-1。
样例输入
3 3 9 1 2 3 2 3 4 3 4 5样例输出
4思路:
- 将以rows为起点的矩阵存入一维sum数组中
- 之后使用尺取法遍历sum数组来找出满足题目条件的元素数目
- 时间复杂度O(n^3)满足题目条件
AcCode:
import java.util.Arrays; import java.util.Scanner; public class Main{ public static int getMax(int[][] nums,int k) { int maxNum = -1; int[] sum = new int[nums[0].length]; for (int rows = 0; rows < nums.length; rows++) { Arrays.fill(sum, 0); for (int i = rows; i < nums.length; i++) { for (int j = 0; j < nums[i].length; j++) { sum[j]+=nums[i][j]; } //尺取法 int begin = 0; int end = begin+1; int p = 0; int thisSum = sum[begin]; if(thisSum<k) { if((begin+1)*(i+1)>maxNum) { maxNum = (begin+1)*(i+1); } } while(begin<sum.length && end<sum.length) { if(end!=p) { thisSum+=sum[end]; } if(thisSum<k) { if((end-begin+1)*(i-rows+1)>maxNum) { maxNum = (end-begin+1)*(i-rows+1); //System.out.println(i+" "+begin+" "+end); } end++; }else { p = end; thisSum-=sum[begin]; if(begin==end) { p=-1; end = begin+1; continue; } begin++; } } } } return maxNum; } public static void main(String[] args) { Scanner in = new Scanner(System.in); int N = in.nextInt(); int M = in.nextInt(); int k = in.nextInt(); int[][] nums = new int[N][M]; for (int i = 0; i < nums.length; i++) { for (int j = 0; j < nums[i].length; j++) { nums[i][j] = in.nextInt(); } } System.out.println(getMax(nums, k)); } }
#1502 : 最大子矩阵
最新推荐文章于 2025-02-16 21:35:47 发布
