hihocoder #1502 : 最大子矩阵
来源:互联网 发布:招标代理服务费的算法 编辑:程序博客网 时间:2024/06/07 02:36
#1502 : 最大子矩阵
时间限制: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
两个for 枚举 答案矩阵所在的行号,
由于题目要求的是 元素尽可能多的子矩阵,其和显然也是随之递增的
因此我们可以二分列的长度,然后把行号固定,所有长度为len的所有矩阵枚举一遍,复杂度 n^3*logn ,1e8还好吧
或者two pointer(尺取法)一下就可以n^3了
#include<bits/stdc++.h>using namespace std;typedef long long ll;const int size = 255;int mat[size][size];int sum[size][size];int tok[size];int n, m, k;int main(){ int a; scanf("%d %d %d", &n, &m, &k); for (int i = 1; i <= m; i ++) sum[0][i] = 0; for (int i = 1; i <= n; i ++) for (int j = 1; j <= m; j ++) { scanf("%d", &mat[i][j]); sum[i][j] = sum[i-1][j] + mat[i][j]; } int ans = -1; for (int len = 1; len <= n; len ++) for (int i = 1; i + len - 1 <= n; i ++) { tok[0] = 0; for (int j = 1; j <= m; j ++) { tok[j] = sum[i + len - 1][j] - sum[i - 1][j]; tok[j] += tok[j-1]; } int p1 = 1, p2 = 1; while(p2<=m) { while (tok[p2]-tok[p1-1]<=k&&p2<=m) p2++; if (tok[p2-1]-tok[p1-1]<=k) ans=max(ans,(p2-p1)*len); while (tok[p2]-tok[p1-1]>k&&p1<=p2) p1++; } } if(!ans) ans=-1; assert(ans==-1||ans>0); printf("%d\n", ans); return 0;}
0 0
- hihocoder #1502 : 最大子矩阵
- hihocoder 1580(最大子矩阵变形)
- Hihocoder-1286 子矩阵求和
- 2017 ICPC 北京站 H (hihocoder 1634) Puzzle Game (dp 最大子矩阵和)
- 最大子矩阵问题
- 最大子矩阵模板
- 最大子矩阵问题
- 最大子矩阵问题
- 最大01 子矩阵
- 最大子矩阵问题
- 最大子矩阵
- 最大子矩阵问题
- 最大子矩阵和
- 最大子矩阵问题
- 最大子矩阵问题:
- 最大子矩阵和
- 最大子矩阵之和
- 最大子矩阵问题
- 企业必备报表工具
- C#学习日记 对称密钥
- hdu 3790 最短路径问题
- 用况图的绘制
- 用Ajax方式提交数据给servlet
- hihocoder #1502 : 最大子矩阵
- 常见的浏览器兼容性问题
- 二维数组中的查找
- 五子棋笔记
- 网页字体缩放样式:-webkit-text-size-adjust的用法
- 真正意义上的inline-block水平呈现的元素间,换行显示或空格分隔的情况下会有间距
- centos7下安装mysql
- 【记录算法题之路】剑指offer--二维数组中的查找
- Codeforces Round #408 (Div. 2) D. Police Stations 最短路、BFS