ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила
вернуться в форум

Обсуждение задачи 1018. Двоичная яблоня

I used DP tree,but i got TLE on #9,who can help me
Послано sxqqslf 23 июл 2009 10:44
I used DP tree,but i got TLE on #9,who can help me?
Here is my program:

program ural1018;
var
  a,b,c,n,q,i,j:longint;
  l,r,tot:array[0..100] of longint;
  map,f:array[0..100,0..100] of longint;
  use:array[0..100] of boolean;
procedure setup(v:longint);
var
  i:longint;
begin
  for i:=1 to n do
  if (map[v,i]<>-1)and(not use[i]) then
  begin
    if l[v]=0 then l[v]:=i else
    if r[v]=0 then r[v]:=i;
    use[v]:=true;
    setup(i);
  end;
end;
procedure ready(v:longint);
begin
  if l[v]<>0 then begin inc(tot[v]);ready(l[v]);end;
  if r[v]<>0 then begin inc(tot[v]);ready(r[v]);end;
  tot[v]:=tot[v]+tot[l[v]]+tot[r[v]];
end;
procedure dp(v,q:longint);
var
  i,x:longint;
begin
  if q=0 then exit;
  if l[v]>0 then
  begin
    if (q-1<=tot[l[v]])and(q-1>=0) then
    dp(l[v],q-1);
    if f[v,q]<f[l[v],q-1]+map[l[v],v] then
    f[v,q]:=f[l[v],q-1]+map[l[v],v];
  end;
  if r[v]>0 then
  begin
    if (q-1<=tot[r[v]])and(q-1>=0) then
    dp(r[v],q-1);
    if f[v,q]<f[r[v],q-1]+map[v,r[v]] then
    f[v,q]:=f[r[v],q-1]+map[v,r[v]];
  end;
  if (l[v]>0)and(r[v]>0) then
  for i:=0 to q-2 do
  if (i<=tot[l[v]])and(q-i-2<=tot[r[v]])and(q-i-2>=0) then
  begin
    dp(l[v],i);
    dp(r[v],q-i-2);
    if f[v,q]<f[l[v],i]+f[r[v],q-i-2]+map[v,l[v]]+map[v,r[v]] then
    f[v,q]:=f[l[v],i]+f[r[v],q-i-2]+map[v,l[v]]+map[v,r[v]];
  end;
  if (l[v]=0)and(r[v]=0) then f[v,q]:=0;
end;
begin
  readln(n,q);if q>=n-1 then q:=n-1;
  for i:=1 to n do
  for j:=1 to n do map[i,j]:=-1;
  while not eof do
  begin
    read(a,b,c);
    map[a,b]:=c;
    map[b,a]:=c;
  end;
  setup(1);
  ready(1);
  dp(1,q);
  write(f[1,q]);
end.