hdu1505City Game(动态规划)
City Game
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 8359 Accepted Submission(s): 3630
Each area has its width and length. The area is divided into a grid of equal square units.The rent paid for each unit on which you\’re building stands is 3$.
Your task is to help Bob solve this problem. The whole city is divided into K areas. Each one of the areas is rectangular and has a different grid size with its own length M and width N.The existing occupied units are marked with the symbol R. The unoccupied units are marked with the symbol F.
R – reserved unit
F – free unit
In the end of each area description there is a separating line.
5 6
R F F F F F
F F F F F F
R R R F F F
F F F F F F
F F F F F F
5 5
R R R R R
R R R R R
R R R R R
R R R R R
R R R R R
题意:给出一个矩阵,上面是可以用的土地和不能用的土地,要在上面选一块矩形的土地建房子,问最大能选多大的土地,土地每单位3块大洋,最后输出租金
核心是动态规划做的。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int a[1010][1010]; 4 int l[1010],r[1010]; 5 int main() 6 { 7 int k; 8 while(~scanf("%d",&k)) 9 { 10 int m,n; 11 while(k--) 12 { 13 scanf("%d %d",&m,&n); 14 memset(a,0,sizeof(a)); 15 for(int i=0; i<m; i++) 16 { 17 for(int j=0; j<n; j++) 18 { 19 char c[2];//以后输入字符 中间带空格的题目都可以直 20 cin>>c; // 接输入字符数组 21 if(c[0]==\'F\') a[i][j]=1; 22 } 23 } 24 for(int i=1; i<m; i++) 25 { 26 for(int j=0; j<n; j++) 27 { 28 if(a[i][j]!=0) a[i][j]=a[i-1][j]+1; 29 } 30 } 31 int max=0; 32 for(int i=0; i<m; i++)//一行一行找过去,求最大面积 33 { 34 for(int j=0; j<n; j++) 35 { 36 l[j]=j; 37 while(l[j]>0&&a[i][l[j]-1]>=a[i][j]) l[j]=l[l[j]-1];//向左边,当前l[j]继承符合要求的前 38 } // 一个的左边界,动态规划的核心,因为前一个 39 for(int j=n-1; j>-1; j--) //点的高度大于当前点,所以前一个点的左边界,当前点可以直接继承使用 40 { 41 r[j]=j; 42 while(r[j]<n-1&&a[i][r[j]+1]>=a[i][j]) r[j]=r[r[j]+1];//向右边,思路和左边界一样 43 } 44 for(int j=0; j<n; j++) 45 if(max<((r[j]-l[j]+1)*a[i][j])) max=((r[j]-l[j]+1)*a[i][j]);//表示从当前点向左右延伸的矩形面积 46 } 47 printf("%d\n",max*3);//每单位面积3块大洋 48 49 } 50 51 } 52 return 0; 53 }