洛谷【p3360】偷天换日【树形dp】

洛谷【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;
}

猜你喜欢

转载自blog.csdn.net/qq_40355973/article/details/80110656