win7网站后台无法编辑企业网站首页设计与制作
2026/1/21 17:21:54 网站建设 项目流程
win7网站后台无法编辑,企业网站首页设计与制作,互联网创业项目,wordpress点注册后一直不出来3562: 折扣价交易股票的最大利润注#xff1a;数据范围说 hierarchy.length n - 1#xff0c;且 员工 1 是所有员工的直接或间接上司#xff0c;所以输入是一个 n 点 n−1 边的连通图#xff0c;即树。思路#xff1a;树上背包 状态机 DP寻找子问题 站在节点 x 上#…3562: 折扣价交易股票的最大利润注数据范围说 hierarchy.length n - 1且 员工 1 是所有员工的直接或间接上司所以输入是一个 n 点 n−1 边的连通图即树。思路树上背包 状态机 DP寻找子问题站在节点 x 上讨论是否购买 present[x]。设节点 y 是节点 x 的儿子。如果不买 present[x]且预算至多为 j那么问题变成从 x 的所有子树 y 中能得到的最大利润之和。所有子树 y 的花费总和必须 ≤j。present[y] 不能半价购买。如果买 present[x]且预算至多为 j那么问题变成从 x 的所有子树 y 中能得到的最大利润之和加上买 present[x] 得到的利润。买 present[x] 花了 cost其中 cost 等于 present[x]原价买股票或者 ⌊present[x]/2⌋半价买股票取决于 x 的父节点有没有买股票。所有子树 y 的花费总和必须 ≤j−cost。present[y] 可以半价购买。状态设计和状态转移dfs(x) 返回一个长为 (budget1)×2 的二维数组 f其中 f[j][k] 表示从子树 x 中能得到的最大利润之和。预算为 j即花费总和 ≤j。k0 表示 present[x] 不能半价购买k1 表示 present[x] 可以半价购买。首先计算x 的所有儿子子树 y 的最大利润总和subF[j][k]。枚举 x 的儿子 y枚举分配给当前儿子 y 的预算 jy0,1,2,…,j那么分配给前面遍历过的儿子的总预算为 j−jy。用前面遍历过的儿子的收益 subF[j−jy][k] 加上当前儿子 y 的收益 dfs(y)[jy][k]更新 subF[j][k] 的最大值。注意这里用了 0-1 背包的空间优化倒序遍历 | 至多然后考虑 present[x] 是否购买计算 f[j][k]不买 present[x]那么分配给儿子子树的预算不变仍然为 j即 f[j][k]subF[j][0]这里的 0 是因为对于子树 y 来说父节点 x 一定不买。买 present[x]那么分配给儿子子树的预算要扣掉 cost即 f[j][k]subF[j−cost][1]这里的 1 是因为对于子树 y 来说父节点 x 一定买。vectorvectorint g(n); for(auto e:hierarchy) g[e[0]-1].push_back(e[1]-1);把输入的hierarchy转成邻接表g[x]表示x的子节点列表。创建了一个长度为budget 1的数组每个元素是一个长度为 2 的int数组整体可以用f[i][0]和f[i][1]来访问。auto dfs [](this auto dfs, int x) - vectorarrayint, 2返回一个(budget1) × 2的表f[j][0]父节点没买时子树x在预算j下的最大利润。f[j][1]父节点买了时子树x在预算j下的最大利润。return dfs(0)[budget][0];递归调用dfs(0)返回一个vectorarrayint, 2然后取budget行、0列的值。vectorarrayint, 2 sub_f(budget 1);在上司状态为 k 的条件下只考虑 x 的所有下属不含 x 本人能得到的 最大净利润。对每个子节点y做分组背包把y的子树看作一个「物品组」体积是jy价值是fy[jy][k]。用倒序枚举预算类似 0-1 背包避免重复计算。vectorarrayint, 2 f(budget 1);再决定x自己买不买return dfs(0)[budget][0];根没有上司相当于上司没买k0取f[budget][0]即为整棵树在折扣政策下的最大净利润。class Solution { public: int maxProfit(int n, vectorint present, vectorint future, vectorvectorint hierarchy, int budget) { //建树-下标转换 vectorvectorint g(n); for(auto e:hierarchy) g[e[0]-1].push_back(e[1]-1); auto dfs[](this auto dfs,int x)-vectorarrayint,2{ // 计算从 x 的所有儿子子树 y 中能得到的最大利润之和x 不买/买 vectorarrayint,2 sub_f(budget1); for(int y:g[x]){ auto fydfs(y); for(int jbudget;j0;j--){ // 枚举子树 y 的预算为 jy //看作一个体积为 jy价值为 fy[jy][k] 的物品 for(int jy0;jyj;jy){ for(int k0;k2;k){ // k0: x 不买k1: x 买 sub_f[j][k]max(sub_f[j][k],sub_f[j-jy][k]fy[jy][k]); } } } } // 计算从子树 x 中能得到的最大利润之和x 父节点不买/买 vectorarrayint,2 f(budget1); for(int j0;jbudget;j){ for(int k0;k2;k){ // k0: x 父节点不买k1: x 父节点买 int costpresent[x]/(k1); if(jcost) f[j][k]max(sub_f[j][0],sub_f[j-cost][1]future[x]-cost); else{ //超过预算只能不买 x f[j][k]sub_f[j][0]; } } } return f; }; return dfs(0)[budget][0]; } };

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询