HDU 2830 Matrix Swapping II
阿新 • • 發佈:2018-12-22
分類
HDU 動態規劃 貪心
題意
給我們一個矩陣,問我們最大全1矩陣的面積。注意矩陣的每一列都可以交換。
即HDU1505 HDU1506 的升級版
想法
dp[i][j] : 從a[i][j]往下有多少個1
例如 :
a:
1011
1001
0001
dp:
2013
1002
0001
然後每次對一行進行排序例如:第一行是 3210
程式碼
421ms
/**
* Author: GatesMa
* Email: [email protected]
* Todo: ACM Training
* Date:2018/11/18
*/
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1111;
char a[maxn][maxn];
int dp[maxn][maxn];
/*
dp[i][j] : 從a[i][j]往下有多少個1
例如 :
a:
1011
1001
0001
dp:
2013
1002
0001
然後每次對一行進行排序例如:第一行3210
其他相似:HDU1505 HDU1506
*/
int n, m;
bool cmp(int a,int b)
{
return a > b;
}
int main()
{
while(cin >> n >> m)
{
memset(dp, 0, sizeof(dp));
for(int i =1;i <= n;i++)
{
scanf("%s",a[i]+1);
}
for(int j = 1;j <= m;j++)
{
for(int i = n;i >=1;i--)
{
if(a[i][j] == '1'){
dp[i][j] = dp[i+1][j] + 1;
}else{
dp[i][j] = 0;
}
}
}
for(int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
cout << dp[i][j] ;
}
cout << endl;
}
int ans = 0;
for(int i = 1;i <= n;i++)
{
int res = 0;
sort(dp[i]+1, dp[i]+m+1, cmp);
for(int j = 1;j <= m;j++)
{
res = max(res, dp[i][j] * j);
}
ans = max(ans, res);
}
printf("%d\n",ans);
}
}