HDU1937 Finding Seats(dp求最小矩形)

题目描述:告诉你人数,求最小能容纳它们的矩形的面积

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <ctype.h>
using namespace std;
int dp[302][302];
int test(int i,int j,int k,int l)
{
    return dp[i][j]-dp[i][l-1]-dp[k-1][j]+dp[k-1][l-1];
}
int main()
{
    int x,y,z;
    while(scanf("%d%d%d",&x,&y,&z),x)
    {
        int mmin=x*y;
        for(int i=1; getchar(),i<=x; i++)
            for(int j=1; j<=y; j++)
                dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+(getchar()=='.');
        for(int i=1; i<=x; i++)
            if(dp[i][y]>=z)
                for(int j=y; dp[i][j]>=z; j--)
                    for(int k=1; k<=x&&test(i,j,k,1)>=z; k++)
                        for(int l=j-mmin/(i-k+1)+1>0?j-mmin/(i-k+1)+1:0; l<=j; l++)
                            if(test(i,j,k,l)>=z)
                                mmin=(i-k+1)*(j-l+1)<mmin?(i-k+1)*(j-l+1):mmin;
                            else break;
        printf("%d\n",mmin);
    }
    return 0;
}

 

posted on 2015-09-05 10:37  恶devil魔  阅读(168)  评论(0编辑  收藏  举报

导航