1. 程式人生 > >HDU 2830 Matrix Swapping II

HDU 2830 Matrix Swapping II

分類

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); } }