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