记录编号 1333 评测结果 AAAAAAAAAA
题目名称 [IOI 1994] 数塔 最终得分 100
用户昵称 Gravatar苏轼 是否通过 通过
代码语言 Pascal 运行时间 0.006 s
提交时间 2008-09-01 21:10:41 内存使用 0.23 MiB
显示代码纯文本
{Made by Cui Hao}
program shuta;

var n,i,j:longint;                                  
     {n:读取数塔层数; i,j:循环控制变量;}
    max,st,nex:array[1..100,1..100]of longint;      
     {数组[max:纪录从该位置开始最大数字和; st:记录数塔上该位置的数; nex:记录该位置开始和最大数字序列中下一个数字横排位置;}
    f1:text;
     {f1:输入输出变量;}

begin
 assign(f1,'shuta.in');
 reset(f1);

 readln(f1,n);

 for i:=1 to n do
  for j:=1 to i do
  begin
   read(f1,st[i,j]);
   max[i,j]:=st[i,j];
    {max赋初值为当前该位置上的数}
  end;

 close(f1);
  {读入数塔}

 for i:=n-1 downto 1 do
  for j:=1 to i do
   if max[i+1,j]>=max[i+1,j+1] then
   begin
    max[i,j]:=max[i,j]+max[i+1,j];
    nex[i,j]:=j;
     {如果下一行左边的位置开始最大数字和较大,该位置开始最大数字和max加上前者,并纪录下一个数字位置}
    end else
    begin
     max[i,j]:=max[i,j]+max[i+1,j+1];
     nex[i,j]:=j+1;
      {如果下一行右边的位置开始最大数字和较大,该位置开始最大数字和max加上前者,并纪录下一个数字位置}
    end;
  {从尾到头计算该位置开始最大数字和}

 assign(f1,'shuta.out');
 rewrite(f1);

 writeln(f1,max[1,1]);

 j:=nex[1,1];
 write(f1,st[1,1],' ');
 for i:=2 to n do
 begin
  write(f1,st[i,j],' ');
  j:=nex[i,j];
 end;
  {输出路径,每次把下一个数字位置赋给j,每次输出该行j位置的数}

 close(f1);
  {输出}
end.