洛谷【p3360】偷天换日【树形dp】
题目描述
艺术馆由若干个展览厅和若干条走廊组成。每一条走廊的尽头不是通向一个展览厅,就是分为两个走廊。每个展览厅内都有若干幅画,每副画都有一个价值。经过走廊和偷画都是要耗费时间的。警察会在n 秒后到达进口,在不被逮捕的情况下你最多能得到的价值。
输入输出格式
- 输入格式:
第一行一个整数 n(n≤600)。
第二行若干组整数,对于每组整数(t,x),t 表示进入这个展览厅或经过走廊要耗费 t秒的时间,若x>0 表示走廊通向的展览厅内有x 幅画,接下来x对整数(w,c)表示偷一幅价值为 w 的画需要 c秒的时间。若
x=0 表示走廊一分为二。(t,c≤5; x≤30)
输入是按深度优先给出的。房间和走廊数不超过 300 个。 - 输出格式:
仅一个整数,表示能获得的最大价值。
#include<stdio.h>
#include<string.h>
int dp[305][605],vis=1;
int n,m;
int max(int a,int b)
{
return a>b?a:b;
}
int adde(int now)
{
int t,x,w,c,i,j,ww1,ww2;
scanf("%d %d",&t,&x);
t*=2;
if(x==0)
{
vis++;
int l=vis;
ww1=adde(l);
vis++;
int r=vis;
ww2=adde(r);
for(i=t;i<=n;i++)
{
for(j=0;j<=i-t;j++)
{
dp[now][i]=max(dp[now][i],dp[l][j]+dp[r][i-j-t]);
}
}
return t;
}
else
{
for(i=0;i<x;i++)
{
scanf("%d %d",&w,&c);
for(j=n;j>=c;j--)
{
if(j-c>=t)
dp[now][j]=max(dp[now][j],dp[now][j-c]+w);
}
}
return t;
}
}
int main()
{
int t;
scanf("%d",&n);
n--;
t=adde(0);
printf("%d",dp[0][n]);
return 0;
}