P1270 “访问”美术馆

P1270 “访问”美术馆 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

经典二叉树dp问题

这道题的建图很有意思:

以及细节处理来回走的trick:小偷最后是要从原点逃出的,所以我们要把每条边的长度*2,来方便处理

void build(int x)
{
    dis[x]=read(),num[x]=read();
    dis[x]*=2;
    if(!num[x])
    {
        build(x<<1);
        build(x<<1|1);
    }
}

然后这道题要联系生活实际中的走廊和样例。

 

x的左儿子为x<<1,x的右儿子为x<<1|1;

我们令dp[x][i]为在x子树里花i时间所能获得的最大数

对于dp[x][i],我们令它在左边花的时间为 j,则在左儿子所花的时间为L=j-dis[x],根据图理解,在右儿子所花的时间为R=i-j,因为右儿子是从左儿子走来的,而不是之间从父节点走来的,故不是R=i-j-dis[x]。这跟苹果二叉树有点像,但这更难。

转移:x没有走廊:dp[x][i]=max(dp[x][i],dp[x<<1][L]+dp[x<<1|1][R]); 

  x有走廊:dp[x][i]=min((i-dis[x])/5,num[x]);

Code:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mp make_pair
#define pb push_back   
#define popb pop_back  
#define fi first
#define se second
const int N=1e3;
//const int M=;
//const int inf=0x3f3f3f3f;     
//const ll INF=0x3ffffffffffff;
int T,t,dis[N],num[N],dp[N][N];
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*f;
}
void build(int x)
{
    dis[x]=read(),num[x]=read();
    dis[x]*=2;
    if(!num[x])
    {
        build(x<<1);
        build(x<<1|1);
    }
}
void dfs(int x)
{
    if(!num[x])
    {
//        printf("%d\n",t); 
        dfs(x<<1);
        dfs(x<<1|1);
        for(int i=dis[x]+1;i<=t;i++) //在 x 节点花的总时间 
        {
            for(int j=dis[x];j<=i&&(i-j)>=0;j++) //在左边上花的总时间 
            {
                int L=j-dis[x]; //在左儿子上花的总时间
                int R=(i-j); //在右儿子上花的总时间 不是R=(i-j)-dis[x],理解走廊的意义 
                dp[x][i]=max(dp[x][i],dp[x<<1][L]+dp[x<<1|1][R]); 
            }
        }
    }
    else 
    {
        for(int i=dis[x];i<=t;i++)
            dp[x][i]=min((i-dis[x])/5,num[x]);
    }
}
int main()
{
//    freopen("","r",stdin);
//    freopen("","w",stdout);
    t=read();t--;
    build(1);
    dfs(1);
//    for(int i=1;i<=t;i++) printf("%d %d\n",i,dp[1][i]);
    printf("%d",dp[1][t]);
    return 0;
}

 

 

 

 

posted @ 2023-03-12 20:32  QAQ啥也不会  阅读(26)  评论(0编辑  收藏  举报