数的乘积 双dp

来源:互联网 发布:网络传真机如何使用 编辑:程序博客网 时间:2024/04/30 03:44
 背景 Background  清北学堂TYVJ9月模拟赛试题第三题       描述 Description    给一个N*N的数字矩阵,我们定义最左上的格子为(1,1)最右下的格子为(N,N)。现在从(1,1)出发,每次只能往下一格或者往右一格,到达(N,N)。
  要求一路上所有数的乘积的十进制表示下,末尾的0的个数最少。
  且路径中不能经过数值是0的点。       输入格式 Input Format  第一行一个数N。
接下来N行,每行N个数,来描述这个矩阵。
矩阵的所有元素都是非负的。       输出格式 Output Format  一个数,表示最少的0的个数,保证肯定有解。       样例输入 Sample Input [复制数据]         样例输出 Sample Output [复制数据]         时间限制 Time Limitation  时间限制 1s   

 

 

 

 

注释 Hint

 

 

数据规模
对于30% 的数据 N≤250。
对于100% 的数据 1≤N≤1 000。

 

 

 

var a,b,c,f:array[0..1000,0..1000] of longint;n,m,i,j,k,sum:longint;procedure chusi;var i,j:longint;begin for i:=0 to n do  for j:=0 to n do   f[i,j]:=maxlongint div 10; f[0,0]:=0; f[0,1]:=0; f[1,0]:=0;end;function min(x,y:longint):longint;begin if x<y then exit(x); exit(y);end;begin readln(n); for i:=1 to n do  begin  for j:=1 to n do   begin    read(c[i,j]); k:=c[i,j];    if k<>0 then    begin    while k mod 2=0 do     begin      inc(a[i,j]); k:=k div 2;     end;    while k mod 5=0 do     begin      inc(b[i,j]); k:=k div 5;     end;    end;   end;   readln;  end; chusi; for i:=1 to n do  for j:=1 to n do   if c[i,j]<>0 then   f[i,j]:=min(f[i-1,j],f[i,j-1])+a[i,j]; sum:=f[n,n]; chusi; for i:=1 to n do  for j:=1 to n do   if c[i,j]<>0 then   f[i,j]:=min(f[i-1,j],f[i,j-1])+b[i,j]; sum:=min(sum,f[n,n]); writeln(sum); end.