最小面积子矩阵

转自:https://blog.csdn.net/jaster_wisdom/article/details/52153685

题目描述

一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵(矩阵中元素个数为矩阵面积)

输入描述:

每个案例第一行三个正整数N,M<=100,表示矩阵大小,和一个整数K
接下来N行,每行M个数,表示矩阵每个元素的值

输出描述:

输出最小面积的值。如果出现任意矩阵的和都小于K,直接输出-1。

示例1

输入

复制

4 4 10
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16

输出

复制

1
#include <iostream>
#include <cstring>
using namespace std;  

int matrix[110][110];
int num[110];
int N,M;
int K;  

void merge(int i,int j){
    for(int p=0;p<N;p++){
        for(int k=i;k<=j;k++){
            num[p] += matrix[p][k];  //合并成一维数组
        }
    }
}  

int findShortest(){
    int start = 0,end = 0;
    int sum = 0;
    int len = N;
    int ans = len + 1;
    bool flag = false;
    while(end < len){
        if(sum < K){
            sum += num[end];
        }
        while(sum >= K){
            flag = true;
            ans = min(ans,end-start+1);
            sum -= num[start++];
        }
        end ++;
    }
    if(flag)
        return ans;
    else
        return N*M;    //全部加起来值都没超过K
}  

int main(){
    while(cin>>N>>M){
        cin>>K;
        int sum = 0;
        for(int i=0;i<N;i++){
            for(int j=0;j<M;j++){
                cin>>matrix[i][j];
                sum += matrix[i][j];
            }
        }
        if(sum < K)
            cout<<-1<<endl;
        else{
            int min_element = N*M;
            for(int i=0;i<M;i++){
                for(int j=i;j<M;j++){
                    memset(num,0,sizeof(num));
                    merge(i,j);
                    int temp = findShortest();
                    temp = (j - i + 1) * temp;
                    if(temp < min_element)
                        min_element = temp;
                }
            }
            cout<<min_element<<endl;
        }
    }
    return 0;
}  

//使用dp求解最小子序列。

原文地址:https://www.cnblogs.com/BlueBlueSea/p/9229818.html

时间: 2024-10-08 16:06:09

最小面积子矩阵的相关文章

九度oj 题目1102:最小面积子矩阵

题目描述: 一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵(矩阵中元素个数为矩阵面积) 输入: 每个案例第一行三个正整数N,M<=100,表示矩阵大小,和一个整数K接下来N行,每行M个数,表示矩阵每个元素的值 输出: 输出最小面积的值.如果出现任意矩阵的和都小于K,直接输出-1. 样例输入: 4 4 10 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 样例输出: 1 这道题的题意读了半天才读懂,它是要求输出满足条件的最小的矩阵面积.解决这类

2010上交:最小面积子矩阵

题目描述: 一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵(矩阵中元素个数为矩阵面积) 输入: 每个案例第一行三个正整数N,M<=100,表示矩阵大小,和一个整数K接下来N行,每行M个数,表示矩阵每个元素的值 输出: 输出最小面积的值.如果出现任意矩阵的和都小于K,直接输出-1. 样例输入: 4 4 10 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 样例输出: 1 #include<cstdio> #include<cstr

一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵

题目描述: 一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵(矩阵中元素个数为矩阵面积) 输入: 每个案例第一行三个正整数N,M<=100,表示矩阵大小,和一个整数K 接下来N行,每行M个数,表示矩阵每个元素的值 输出: 输出最小面积的值.如果出现任意矩阵的和都小于K,直接输出-1. 样例输入: 4 4 10 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 样例输出: 1 首先这个题应该是有一个动态规划的解法,不过好像复杂度也要到O(n^3lo

LeetCode939 最小面积矩形

LeetCode939最小面积矩形 给定在 xy 平面上的一组点,确定由这些点组成的矩形的最小面积,其中矩形的边平行于 x 轴和 y 轴. 如果没有任何矩形,就返回 0. Input [[1,1],[1,3],[3,1],[3,3],[2,2]] Output 4 hint 1 <= points.length <= 500 0 <= points[i][0] <= 40000 0 <= points[i][1] <= 40000 所有的点都是不同的. 题目大意 给许多

[Swift Weekly Contest 116]LeetCode963. 最小面积矩形 II | Minimum Area Rectangle II

Given a set of points in the xy-plane, determine the minimum area of any rectangle formed from these points, with sides not necessarily parallel to the x and y axes. If there isn't any rectangle, return 0. Example 1: Input: [[1,2],[2,1],[1,0],[0,1]]

codeforces1c给出三点求面积

题意:有一个正n边形的斗兽场,现存有3根柱子,柱子位于正n边形的任意3个节点上.求出正n边形的最小面积. 1 #include <iostream> 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <math.h>//采用三角函数大部分使用弧度 5 #include <utility> 6 #include <algorithm> 7 using namespace std;

2014子矩阵

题目描述 Description 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与 列的相对顺序)被称为原矩阵的一个子矩阵.例如,下面左图中选取第 2.4 行和第 2.4.5 列交叉位置的元素得到一个 2*3 的子矩阵如右图所示. 相邻的元素:矩阵中的某个元素与其上下左右四个元素(如果存在的话)是相邻的. 矩阵的分值:矩阵中每一对相邻元素之差的绝对值之和. 本题任务:给定一个 n 行 m 列的正整数矩阵,请你从这个矩阵中选出一个 r 行 c 列的 子矩阵,

子矩阵(暴搜(全排列)+DP)

子矩阵(暴搜(全排列)+DP) 一.题目 子矩阵 时间限制: 1 Sec  内存限制: 128 MB 提交: 1  解决: 1 [提交][状态][讨论版] 题目描述 给出如下定义: 1. 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第2.4行和第2.4.5列交叉位置的元素得到一个2*3的子矩阵如右图所示. 9 3 3 3 9 9 4 8 7 4 1 7 4 6 6 6 8 5 6 9 7 4 5 6 1 的

2015年百度之星初赛(1) --- F 矩形面积

矩形面积 Problem Description 小度熊有一个桌面,小度熊剪了很多矩形放在桌面上,小度熊想知道能把这些矩形包围起来的面积最小的矩形的面积是多少. Input 第一行一个正整数 T,代表测试数据组数($1 \leq T \leq 20$),接下来 T 组测试数据. 每组测试数据占若干行,第一行一个正整数 $N(1 \leq N < \leq 1000)$,代表矩形的数量.接下来 N 行,每行 8 个整数$x_1, y_1, x_2, y_2, x_3, y_3, x_4, y_4$