P1270 “访问”美术馆——不太一样的树形DP

P1270 “访问”美术馆

dfs读入,存图有点像线段树;

在枚举时间时,要减去走这条边的代价;

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1010;

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*=2;
    if(!t[x].pic)
    {
        read(x<<1);
        read((x<<1)+1);
    }
}

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)/5);
        return ;
    }
    
    for(int i=0;i<=ti-t[x].tim;i++)
    {
        dfs(x<<1,i);
        dfs((x<<1)+1,ti-i-t[x].tim);
        dp[x][ti]=max(dp[x][ti],dp[x<<1][i]+dp[(x<<1)+1][ti-i-t[x].tim]);
    }
}

int main()
{
    scanf("%d",&s);
    s--;
    read(1);
    dfs(1,s);
    printf("%d",dp[1][s]);
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/WHFF521/p/11769098.html