hdu2686 dp 可移动的01矩阵

这题的话,和01矩阵差不多,但是每列可以移动,所以每列sort一下就可以了,因为把eof写成n!=0,tle,改了直接200ms...

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <string>
#include <stack>
#include <queue>

const int inf = (1<<31)-1;
const int MAXN = 1e3+10;

using namespace std;

int dp[MAXN][MAXN];
int row[MAXN];
char s[MAXN];

int main()
{
    int n,m,mmax,k;
    while(scanf("%d%d",&n,&m)!=EOF){
        for(int i=1;i<=n;i++){
            scanf("%s",s);
            for(int j=1;j<=m;j++){
                if(s[j-1]=='1'){
                    dp[i][j] = dp[i-1][j]+1;
                }else{
                    dp[i][j] = 0;
                }
            }
            
        }
        
        mmax = 0;
        
        for(int i=1;i<=n;i++){
            k = 0;
            for(int j=1;j<=m;j++){
                if(dp[i][j])
                    row[k++] = dp[i][j];
            }
            sort(row,row+k);
            for(int j=0;j<k;j++){
                mmax = max(mmax,row[j]*(k-j));
            }
        }
        printf("%d\n",mmax);
    }
    return 0;
}
View Code

:smile:

posted @ 2016-04-17 17:51  iEdson  阅读(137)  评论(0编辑  收藏  举报