[ An Ac a Day ^_^ ] hdu 2830 矩阵交换II

第一眼觉得是个dp 但是有了可以随意交换的条件觉得简单了不少

但是还是没做出来……

看了一下别人的做法才觉得自愧不如

因为所有列都可以随意交换 应该尽量把长的放在一起

那么将所有的矩形排序之后

以第j个矩形作为端点的大矩形面积是num[j]*j

只要从头开始都计算一遍就行了……

差距好大-_-||

 

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<cstring>
 6 #include<string>
 7 #include<ctime>
 8 #include<map>
 9 #include<set>
10 #include<vector>
11 #include<queue>
12 #include<cstdlib>
13 #include<cassert>
14 #include<sstream>
15 #include<stack>
16 #include<list>
17 #include<bitset>
18 #define cl(a,b) memset(a,b,sizeof(a))
19 #define debug(x) cerr<<#x<<"=="<<(x)<<endl
20 using namespace std;
21 typedef long long ll;
22 typedef long double ldb;
23 typedef pair<int,int> pii;
24 
25 const int inf=0x3f3f3f3f;
26 const int maxn=1e9+10;
27 const int mod=1e7+7;
28 const double eps=1e-8;
29 const double pi=acos(-1);
30 
31 int dx[8]= {0,0,1,-1,1,-1,1,-1};
32 int dy[8]= {1,-1,0,0,-1,1,1,-1};
33 
34 //---------------------------------------ヽ(^。^)丿
35 
36 bool cmp(int a,int b)
37 {
38     return a>b;
39 }
40 
41 int main()
42 {
43     int n,m;
44     while(~scanf("%d%d",&n,&m))
45     {
46         int ans=0,num[1005],vis[1005];
47         char str[1005];
48         cl(vis,0),cl(num,0);
49         for(int i=0;i<n;i++)
50         {
51             scanf("%s",str);
52             for(int j=0;j<m;j++)
53             {
54                 int ok=str[j]-'0';
55                 if(ok) vis[j]++;
56                 else vis[j]=0;
57                 num[j]=vis[j];
58             }
59             sort(num,num+m,cmp);
60             for(int j=0;j<m;j++)
61                 ans=max(ans,num[j]*(j+1));
62         }
63         printf("%d\n",ans);
64     }
65     return 0;
66 }
67 /*
68 
69 3 4
70 1011
71 1001
72 0001
73 3 4
74 1010
75 1001
76 0001
77 
78 */

 

posted @ 2017-01-15 18:56  良将ℓ  阅读(193)  评论(0编辑  收藏  举报