HDU 2830 Matrix Swapping II (预处理的线性dp)
来源:互联网 发布:人工智能的概念 编辑:程序博客网 时间:2024/06/10 23:15
Matrix Swapping II
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1430 Accepted Submission(s): 950
Problem Description Given an N * M matrix with each entry equal to 0 or 1. We can find some rectangles in the matrix whose entries are all 1, and we define the maximum area of such rectangle as this matrix’s goodness.
We can swap any two columns any times, and we are to make the goodness of the matrix as large as possible.
We can swap any two columns any times, and we are to make the goodness of the matrix as large as possible.
Input
There are several test cases in the input. The first line of each test case contains two integers N and M (1 ≤ N,M ≤ 1000). Then N lines follow, each contains M numbers (0 or 1), indicating the N * M matrix
Output
Output one line for each test case, indicating the maximum possible goodness.
Sample Input
3 41011100100013 4101010010001
Sample Output
42Note: Huge Input, scanf() is recommended.
Source
2009 Multi-University Training Contest 2 - Host by TJU
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2830
题目大意:给一个0/1矩阵,可以任意交换其中的两列,求由1组成的最大子矩形的面积
题目分析:预处理出每个点下方有多个连续的1即cnt[i][j],对每行的cnt值从大到小排序,枚举列dp即可,dp[i]表示以第i行为上边的矩形的面积最大值,转移方程:dp[i] = max(dp[i], j * cnt[i][j])
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2830
题目大意:给一个0/1矩阵,可以任意交换其中的两列,求由1组成的最大子矩形的面积
题目分析:预处理出每个点下方有多个连续的1即cnt[i][j],对每行的cnt值从大到小排序,枚举列dp即可,dp[i]表示以第i行为上边的矩形的面积最大值,转移方程:dp[i] = max(dp[i], j * cnt[i][j])
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int const MAX = 1e3 + 5;int const INF = 0x3fffffff;char s[MAX][MAX];int cnt[MAX][MAX];int dp[MAX];int n, m;bool cmp(int a, int b){ return a > b;}int main(){ while(scanf("%d %d", &n ,&m) != EOF) { memset(cnt, 0, sizeof(cnt)); memset(dp, 0, sizeof(dp)); for(int i = 1; i <= n; i++) scanf("%s", s[i] + 1); for(int i = n; i >= 1; i--) for(int j = 1; j <= m; j++) if(s[i][j] - '0') cnt[i][j] = cnt[i + 1][j] + 1; for(int i = 1; i <= n; i++) { sort(cnt[i] + 1, cnt[i] + 1 + m, cmp); for(int j = 1; j <= m; j++) if(cnt[i][j]) dp[i] = max(dp[i], j * cnt[i][j]); } int ans = 0; for(int i = 1; i <= n; i++) ans = max(ans, dp[i]); printf("%d\n", ans); }}
0 0
- HDU 2830 Matrix Swapping II (预处理的线性dp)
- Matrix Swapping II - HDU 2830 dp
- HDu 2830 Matrix Swapping II(dp)
- HDU-2830-Matrix Swapping II(DP)
- hdu 2830 Matrix Swapping II
- HDU 2830 Matrix Swapping II
- hdu 2830 Matrix Swapping II
- hdu 2830 Matrix Swapping II
- hdu 2830 Matrix Swapping II
- hdu 2830 Matrix Swapping II
- HDU 2830 Matrix Swapping II
- hdu 2830 Matrix Swapping II
- hdu 2830 - Matrix Swapping II
- HDU 2830 Matrix Swapping II
- HDU 2830 Matrix Swapping II
- hdu 2830 Matrix Swapping II
- hdu 2830 Matrix Swapping II
- hdu 2830 Matrix Swapping II
- linux下文件二级系统设计
- 《机器学习实战》课程笔记(第1章)
- C#实现日志
- python3 urllib.request抓资源的方式
- iOS自定义多参数类型方法
- HDU 2830 Matrix Swapping II (预处理的线性dp)
- POJ 3264
- 骑士飞行棋
- 苹果开发 笔记(49)
- mac os卸载JAVA 8
- dex文件格式
- TextView显示指定的行数并且多出的部分显示省略号
- C++ Primer快速入门之四:变量和数据类型
- vector<vector>排序