zoukankan      html  css  js  c++  java
  • GHOJ 341 博览会

    题目描述

            某市正在举行一场大型博览会,博览会有n 个展馆,每个展馆里有若干个展台。这n个展馆以及它们之间的道路可以看成一棵二叉树,博览会的出入口设在根节点——1号展馆,小明将从这里出发乘坐电瓶车到各个展馆参观,并最终回到1号展馆出口。

            由于路程差异,乘坐电瓶车往返不同展馆间的费用也有所区别。出发时,小明的乘车卡里余额为k。他现在想知道,若全程都乘坐电瓶车,他最多能参观多少个展台?

            说明:只要小明到达了某个展馆,就会参观该展馆内的所有展台,若多次参观同一个展台不重复计算。

     

    输入输出格式

    输入格式

            输入共n+2行:

            第1行为2个整数n、k,用一个空格隔开,表示展馆个    数和小明乘车卡初始余额。

            第2行为n个数,用一个空格隔开,表示1号至n号各展馆的展台数目。

            接下来n行,每行4个数,用一个空格隔开;

            第i+2行的4个数分别表示展馆i左子节点展馆号、到左子节点展馆的费用、右子节点展馆号、到右子节点展馆的费用。如果子节点展馆号为0则表示没有对应的子节点展馆。

    输出格式

            输出共1行,1个整数,表示小明最多能参观的展台数量。

    输入输出样例

    输入样例

    10 20

    2 8 5 1 10 5 9 9 3 5

    2 1 3 2

    4 8 5 2

    6 2 7 2

    8 3 9 6

    0 0 10 2

    0 0 0 0

    0 0 0 0

    0 0 0 0

    0 0 0 0

    0 0 0 0

    输出样例

    39

    说明

    样例说明

            根据样例数据,可以得到如下展馆二叉树示意图(每个圈内标示了展馆号及展台数):

    Failed to load picture

            由图可知,小明沿红色箭号路径,到1、2、5、3、6、7 这六个展馆参观并返回,往返乘车费用为18,参观展台数为39,为能够实现的最大值。

    数据规模

            对于40%的数据:n≤10;k≤20;

            对于100%的数据:n≤50;k≤100;所有展馆的展台总数不超过10^5。

    题解

             明显可以看出是树形dp,每次都给子结点传递可花费的费用即可。

    #include <iostream>
    
    #define MAX_N (50 + 5) 
    #define MAX_M (100 + 5) 
    
    using namespace std;
    
    int n, m;
    struct Node
    {
        int v;
        int l, lw, r, rw;
    };
    Node a[MAX_N];
    int dp[MAX_N][MAX_M];
    
    int DP(int x, int y)
    {
        if(dp[x][y]) return dp[x][y];
        if(a[x].l && a[x].r)
        {
             for(register int i = a[x].lw; i + a[x].rw <= y; ++i)
            {
                dp[x][y] = max(dp[x][y], DP(a[x].l, i - a[x].lw) + DP(a[x].r, y - i - a[x].rw));
            }
        }
        if(a[x].l && y >= a[x].lw)
        {
            dp[x][y] = max(dp[x][y], DP(a[x].l, y - a[x].lw));
        } 
        if(a[x].r && y >= a[x].rw) 
        {
            dp[x][y] = max(dp[x][y], DP(a[x].r, y - a[x].rw));
        }
        dp[x][y] += a[x].v;
        // cout << x << " " << y << ":  " << dp[x][y] << "
    "; 
        return dp[x][y];
    }
    
    int main()
    {
        cin >> n >> m;
        for(register int i = 1; i <= n; ++i)
        {
            cin >> a[i].v;
        }
        for(register int i = 1; i <= n; ++i)
        {
            cin >> a[i].l >> a[i].lw >> a[i].r >> a[i].rw;
            a[i].lw <<= 1;
            a[i].rw <<= 1;
        }
        cout << DP(1, m);
        return 0;
    }
    参考程序
  • 相关阅读:
    FiddlerCoreAPI 使用简介
    fiddler script建议教程
    PDF文本内容批量提取到Excel
    pymc_实现贝叶斯统计模型和马尔科夫链蒙塔卡洛
    贝叶斯
    Logistic Ordinal Regression
    逻辑回归原理_挑战者飞船事故和乳腺癌案例_Python和R_信用评分卡(AAA推荐)
    逻辑回归实战--美国挑战者号飞船事故_同盾分数与多头借贷Python建模
    python操作mysql数据库
    多元回归比一元回归优越性
  • 原文地址:https://www.cnblogs.com/kcn999/p/10624850.html
Copyright © 2011-2022 走看看