?? p1180.pas
字號:
program p1180;
const
MAXN=400;
MAXM=400;
type
tree=record
v:longint;
lc,rc:longint;
end;
var
t:array[0..MAXN] of tree;
f:array[0..MAXN] of longint;
d:array[-1..MAXN,-1..MAXM] of longint;
n,m,i,j,k,v:longint;
function dp(i,j:longint):longint;
var
s,k:longint;
begin
if d[i,j]>=0 then dp:=d[i,j]
else begin
d[i,j]:=dp(t[i].rc,j);
for k:=1 to j do begin
s:=dp(t[i].lc,k-1)+dp(t[i].rc,j-k)+t[i].v;
if s>d[i,j] then d[i,j]:=s;
end;
dp:=d[i,j];
end;
end;
{
錯誤的做法
注意:在遞歸體中,不能用局部量存最大,而要用全局量。
function dp(i,j:longint):longint;
var
s,max,k:longint;
begin
if d[i,j]>=0 then dp:=d[i,j]
else begin
max:=dp(t[i].rc,j);
for k:=1 to j do begin
s:=dp(t[i].lc,k-1)+dp(t[i].rc,j-k)+t[i].v;
if s>max then max:=s;
end;
dp:=max;
dp[i,j]:=max;
end;
end;
}
begin
readln(n,m);
fillchar(f,sizeof(f),0);
for i:=0 to n do begin
t[i].lc:=-1;
t[i].rc:=-1;
t[i].v:=0;
end;
for i:=1 to n do begin
readln(k,v);
t[i].v:=v;
if f[k]=0 then t[k].lc:=i
else t[f[k]].rc:=i;
f[k]:=i;
end;
for i:=-1 to n do begin
for j:=-1 to m do begin
if (i=-1) or (j=0) then d[i,j]:=0
else d[i,j]:=-1;
end;
end;
writeln(dp(t[0].lc,m));
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -