题意 给你一个n*m矩阵 每列都可以随便交换位置 求最优交换后最大的全1子矩阵
又是HDU 1505 1506的变种 但这个更容易了 因为每列都可以交换位置了 那么这一行中所有比i高的都可以与i相邻了 只需要统计这一行有多少个比i高就行了 可以在算出每一行后 把高度大的放前面去 用num[i]记录排序后的列原来的数 这样就有j列比h[i][num[j]]高了 最后的答案也就是max(j*h[i][num[j]])
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1005;
char mat[N][N];
int num[N], h[N][N], n, m, i;
bool cmp (int a, int b)
{
return h[i][a] > h[i][b];
}//cmp不能有=
int main()
{
while (~scanf ("%d%d", &n, &m))
{
int ans = 0;
memset (h, 0, sizeof (h));
for (i = 1; i <= n; ++i)
scanf ("%s", mat[i] + 1);
for (i = 1; i <= n; ++i)
{
for (int j = 1; j <= m; ++j)
{
if (mat[i][j] == '1') h[i][j] = h[i - 1][j] + 1;
num[j] = j;
}
sort (num + 1, num + m + 1, cmp);
for (int j = 1; j <= m; ++j)
ans = max (ans, j * h[i][num[j]]);
}
printf ("%d\n", ans);
}
return 0;
}
3 4 1011 1001 0001 3 4 1010 1001 0001
4 2 Note: Huge Input, scanf() is recommended.
HDU 2830 Matrix Swapping II (DP,最大全1矩阵),布布扣,bubuko.com
HDU 2830 Matrix Swapping II (DP,最大全1矩阵)
原文地址:http://blog.csdn.net/iooden/article/details/38497189