Discuz! Board

 找回密码
 立即注册
查看: 606|回复: 1

每日一题6.16(树上背包+状态机dp)

[复制链接]

9

主题

15

回帖

160

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
160

黄金骑士钻石大师

发表于 2025-6-6 01:23:33 | 显示全部楼层 |阅读模式
力扣3562   力扣的题解质量还是太高了,有大佬灵茶山艾府(0x3f)写题解
https://leetcode.cn/problems/max ... counts/description/

6

主题

20

回帖

122

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
122

黄金骑士

发表于 2025-7-5 10:23:19 | 显示全部楼层
[C++] 纯文本查看 复制代码
class Solution {
public:
    int maxProfit(int n, vector<int>& present, vector<int>& future, vector<vector<int>>& hierarchy, int budget) {
        vector<vector<int>>adj(n);
        for(auto &e:hierarchy){
            adj[e[0]-1].push_back(e[1]-1);
        }

        auto dfs=[&](this auto dfs,int u)->vector<array<int,2>>{
            vector<array<int,2>>g(budget+1);

            for(auto v:adj[u]){
                auto ff = dfs(v);

                for(int j=budget;j>=0;j--){
                    for(int jj=0;jj<=j;jj++){
                        for(int k=0;k<=1;k++){
                            g[j][k]=max(g[j][k],g[j-jj][k]+ff[jj][k]);
                        }
                    }
                }
            }

            vector<array<int,2>>f(budget+1);

            for(int j=0;j<=budget;j++){
                for(int k=0;k<2;k++){
                    int cost=present[u]/(k+1);
                    if(j>=cost){
                        f[j][k]=max(g[j][0],g[j-cost][1]-cost+future[u]);
                    }
                    else{
                        f[j][k]=g[j][0];
                    }
                }
            }
            return f;
        };

        return dfs(0)[budget][0];
    }
};
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX ( 鄂ICP备2024088332号-1 )

GMT+8, 2025-7-23 17:36 , Processed in 0.048514 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表