P1270 “访问”美术馆
dfs读入,存图有点像线段树;
在枚举时间时,要减去走这条边的代价;
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=; struct node
{
int tim,pic;
}t[maxn];
int s; void read(int x)
{
scanf("%d%d",&t[x].tim,&t[x].pic);
t[x].tim*=;
if(!t[x].pic)
{
read(x<<);
read((x<<)+);
}
} int dp[maxn][maxn]; void dfs(int x,int ti)
{
if(dp[x][ti]||!ti) return ;
if(t[x].pic)
{
dp[x][ti]=min(t[x].pic,(ti-t[x].tim)/);
return ;
} for(int i=;i<=ti-t[x].tim;i++)
{
dfs(x<<,i);
dfs((x<<)+,ti-i-t[x].tim);
dp[x][ti]=max(dp[x][ti],dp[x<<][i]+dp[(x<<)+][ti-i-t[x].tim]);
}
} int main()
{
scanf("%d",&s);
s--;
read();
dfs(,s);
printf("%d",dp[][s]);
return ;
}