题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1505
City Game
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5711 Accepted Submission(s): 2464
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.
2 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
45 0
| 0 | 1 | 1 | 1 | 1 | 1 |
| 1 | 2 | 2 | 2 | 2 | 2 |
| 0 | 0 | 0 | 3 | 3 | 3 |
| 1 | 1 | 1 | 4 | 4 | 4 |
| 2 | 2 | 2 | 5 | 5 | 5 |
如下:
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
if (map[i][j] == 'R')
dp[i][j] = 0;
else dp[i][j] = dp[i - 1][j] + 1;
}
}得出每一行的数列后,就可以发现这题和HDU1506一毛一样,只是1506求一行,这题要求多行并取最大值
HDU 1506 题解 http://blog.youkuaiyun.com/chenninggo/article/details/48080271
注意下输入,因为卡输入wa了几次,也算是学到了特殊的输入技巧
代码如下。。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int t;
int n, m;
char map[1010][1010], ch[5];
int dp[1010][1010], l[1010], r[1010];
int main()
{
// freopen("input.txt", "r", stdin);
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) //这种输入法真的好好用。。
for (int j = 1; j <= m; j++)
{
scanf("%s", ch);
map[i][j] = ch[0];
}
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n; i++) //处理一下原图
{
for (int j = 1; j <= m; j++)
{
if (map[i][j] == 'R')
dp[i][j] = 0;
else dp[i][j] = dp[i - 1][j] + 1;
}
}
int ans = -1, mx, id;
for (int i = 1; i <= n; i++)
{
memset(l, 0, sizeof(l));
memset(r, 0, sizeof(r));
l[1] = 1;
r[m] = m;
for (int j = 2; j <= m; j++) //和1506一样的方法
{
id = j;
while (id > 1 && dp[i][j] <= dp[i][id - 1])
id = l[id - 1];
l[j] = id;
}
for (int j = m - 1; j >= 1; j--)
{
id = j;
while (id < m && dp[i][j] <= dp[i][id + 1])
id = r[id + 1];
r[j] = id;
}
mx = -1;
for (int j = 1; j <= m; j++)
mx = max(mx, (r[j] - l[j] + 1)*dp[i][j]);
ans = max(mx, ans);
}
printf("%d\n", ans * 3);
}
return 0;
}
410



被折叠的 条评论
为什么被折叠?



