您的位置:首页 > 其它

暑期dp46道(40)--HDOJ 2830 最大子矩阵面积 额

2016-08-18 17:14 429 查看
题目链接:hdoj 2830

不说什么了,上代码:

#include<cstdio>
#include<cstring>
#include<string>

#define debug 0
#define M(a) memset(a,0,sizeof(a))
#define Max(a,b) ((a>b)?a:b)

const int maxn = 1000 + 5;
int h[maxn], num[maxn];
int n, m;

void Do(){

char get; //因为是连续的 01,要用字符读取
int ans = 0;
for (int i = 1; i <= n; i++)
{
M(num);
for (int j = 1; j <= m; j++)
{
while ((get = getchar()) == ' ' || get == '\n');
if (get == '1')
h[j]++; //记录高度
else
h[j] = 0;
for (int k = 1; k <= h[j]; k++) //这题的唯一难点:因为是横向就可以组矩阵
{ //所以高度大的都可组较低的矩阵。
num[k]++;
}
}
for (int k = 1; k <= i; k++)
{
ans = Max(ans, k*num[k]); //高*宽
}
}

printf("%d\n", ans);
}

int main(){
#if debug
freopen("in.txt", "r", stdin);
#endif//debug
while (~scanf("%d%d", &n, &m))
{
M(h);
Do();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息