很水的一道超简单dp(动态规划)。
只不过dp的不是二维数组中的一个变量,而是一整个数组。
Pascal的变量在比赛中可以达到268435456字节,一个longint变量是4字节。
所以可以开67108864个longint变量,担心个屁的空间超限。
标程:
const
maxx=1000000007;
var
a,mx,mn:array [0..100,0..100] of longint;
b:array [0..100,0..100,0..1990] of longint;
n,m,p,i,j,t:longint;
function max(x,y:longint):longint;
begin if x>y then exit(x); exit(y); end;
function min(x,y:longint):longint;
begin if x<y then exit(x); exit(y); end;
begin
assign(input,'count.in'); reset(input);
assign(output,'count.out'); rewrite(output);
readln(n,m,p);
for i:=1 to n do
for j:=1 to m do
read(a[i,j]);
b[0,1,0]:=1;
for i:=1 to n do
for j:=1 to m do
begin
mn[i,j]:=max(min(mn[i-1,j],mn[i,j-1])+a[i,j],p-10*(n+m-i-j)); mx[i,j]:=min(max(mx[i-1,j],mx[i,j-1])+a[i,j],p);
for t:=mn[i,j] to mx[i,j] do
begin
b[i,j,t]:=b[i-1,j,t-a[i,j]]+b[i,j-1,t-a[i,j]];
if b[i,j,t]>=maxx then b[i,j,t]:=b[i,j,t] mod maxx;
end;
end;
writeln(b[n,m,p]);
close(input); close(output);
end.
这程序太快了,64ms跑完,如果不想太引人注目的话,我还给一个没有优化剪枝的248ms的标程:
var
a:array[1..100,1..100] of longint;
f:array[0..100,0..100,0..2000] of longint;
i,j,k,m,n,l,p:longint;
begin
readln(n,m,p);
for i:=1 to n do
for j:=1 to m do read(a[i,j]);
f[1,1,a[1,1]]:=1;
for i:=1 to n do
for j:=1 to m do
for k:=a[i,j]+1 to p do
begin
f[i,j,k]:=(f[i-1,j,k-a[i,j]]+f[i,j-1,k-a[i,j]])mod 1000000007;
end;
writeln(f[n,m,p]);
end.