四、开发区规划
提交文件:d.pas / d.exe
输入文件:d.in
输出文件:d.out
问题描述:
小王是D市主管经济的副市长,由于经济发展的需要,要在D市组建一个高新技术开发区,经过研究,规划局在D市的东部划出了一块土地作为开发区选址。
棘手的是,这块土地有些历史文化遗址散布在某些格子内,这些历史文化遗址是万万不能拆除的,否则将激起民愤,小王深知这一点,因此,他的新建筑在选址时要避开这些格子。
假设新的建筑物有P种规格,每种建筑物都是正方形的,占地为Ti*Ti格 (1<=i<=P)。
现在请你来当小王的秘书 帮他完成这个光荣而艰巨的任务。
数据输入:
从文件d.in读入数据,输入文件第一行包含三个数,分别代表N,M,P (1<=N,M<=2000,1<=P<=1000)。随后的n行,每行有m个0或1(1表示该格为空地,0表示该格有历史文化遗址)。
接下来的P行每行有一个整数Ti (1<Ti<=max(M,N)),代表的第i种建筑物的边长。
数据输出:
结果输出到文件d.out中,共有P行,每行一个整数,第i行的数代表边长为Ti的建筑物选址方案数。
输入输出样例
d.in
4 4 2
1011
1111
1110
1110
2
3
d.out
5
1
思路:
map2[i,j]表示地i,j个点向左上方拓展的最大正方形的边长
sum[i]记录边长为i的正方形空地有多少块
最后跑一遍sum来统计合适的选址方案
var
map:array[0..2001]of ansistring;
map2:array[0..2001,0..2001]of longint;
sum:array[0..2001]of longint;
i,n,j,m,s,t,max,ans:longint;
function min(a,b,c:longint):longint;
begin
if (a<=b)and(a<=c)then exit(a);
if (b<=a)and(b<=c)then exit(b);
exit(c);
end;
begin
readln(n,m,s);
for i:=1 to n do
begin
readln(map[i]);
for j:=1 to m do
begin
if (i=1)or(j=1) then
begin
if map[i,j]<>'0' then map2[i,j]:=1
else map2[i,j]:=0;
end
else
if map[i,j]<>'0' then
map2[i,j]:=min(map2[i-1,j],map2[i-1,j-1],map2[i,j-1])+1;
inc(sum[map2[i,j]]);
if map2[i,j]>max then max:=map2[i,j];
end;
end;
for i:=1 to s do
begin
read(t);
for j:=t to max do
ans:=ans+sum[j];
writeln(ans);
ans:=0;
end;
end.