P4037 [JSOI2008] 魔兽地图

news/2025/12/7 13:00:33/文章来源:https://www.cnblogs.com/zloi-hhq/p/19317967

https://www.luogu.com.cn/problem/P4037

由题目可知整个合成路径可以看作一个森林。

对于答案的统计,我们在处理完每棵树的消耗费用对应的最大力量以后,使用一个背包即可。

这样我们就可以统计出答案了。

现在问题在于如何处理出每一棵树的消耗费用对应的最大力量。

很明显这还是一个背包问题,但是这里需要合成,也就是说有一些物品买过来不能直接计算收益,再加上物品数量有限制,导致这个问题非常复杂。

那么我们可以考虑给背包多开一维状态,这边直接记录下有多少个此物品被用来合成,以此方便转移。

我们设置 \(dp_{i,j,k}\) 表示选择到第 \(i\) 件物品,选择 \(j\) 个此物品用来合成,总共消耗 \(k\) 个金币。

对于基本装备,我们已经知道了可以购买的数量,以及单价,可以直接多重背包。

但是由于我们多记了一维,我们在使用多重背包时还需要枚举合成数量,并且不计入这些用来合成的贡献。

对于高级装备的处理更加复杂,高级装备只能通过合成得到,那么我们就可以通过用来合成的物品数量以及价格推出高级装备的最多选择数量。

易得这个数量一定小于等于用来合成的物品数量。

之后我们枚举合成出来的数量,此时我们不需要考虑这些哪些用来继续合成,因此我们再设置一个 \(dp_i\) 表示在合成出目前枚举的量的情况下的金币消耗。

由于我们需要保证合成出来,所以我们要将背包内的值进行强制更新,也就是说每次枚举一个新的物品,要给背包内所有值都更新一次答案,这样才能保证有值加入,可以合成出来。

处理完成之后就可以直接更新三维状态的背包了。

这样就可以成功处理出每棵树的消耗费用对应的最大力量了。

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,dp[55][105][2005],v[55],c[55],w[55],ans[2005],dp2[2005];
vector<pair<int,int>> e[55];
bool vis[55];
char op;
void dfs(int p){if(e[p].size()==0){//基本装备 w[p]=min(w[p],m/c[p]);for(int i=0;i<=w[p];i++){for(int j=0;j<=i;j++)dp[p][j][i*c[p]]=(i-j)*v[p];}return;}w[p]=1e18,c[p]=0;//高级装备 for(auto tmp:e[p]){int i=tmp.first,x=tmp.second;dfs(i);w[p]=min(w[p],w[i]/x);c[p]+=c[i]*x;}w[p]=min(w[p],m/c[p]);for(int i=0;i<=w[p];i++){memset(dp2,-0x3f,sizeof(dp2));dp2[0]=0;for(auto tmp:e[p]){int u=tmp.first,x=tmp.second;for(int j=m;j>=0;j--){int tmp=-1e18;for(int k=0;k<=j;k++)tmp=max(tmp,dp2[j-k]+dp[u][i*x][k]);dp2[j]=tmp;//强制更新 }}for(int j=0;j<=i;j++){for(int k=0;k<=m;k++)dp[p][j][k]=max(dp[p][j][k],dp2[k]+(i-j)*v[p]);}}
}
signed main(){memset(dp,-0x3f,sizeof(dp));cin>>n>>m;for(int i=1,k;i<=n;i++){cin>>v[i]>>op;if(op=='A'){cin>>k;for(int j=1,v,w;j<=k;j++){cin>>v>>w;e[i].push_back({v,w});vis[v]=1;}}else cin>>c[i]>>w[i];}for(int i=1;i<=n;i++){if(vis[i])continue;dfs(i);for(int j=m;j>=0;j--){//背包处理答案 for(int k=0;k<=j;k++){ans[j]=max(ans[j],ans[j-k]+dp[i][0][k]);}}}cout<<ans[m];return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/991406.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CF1970E3 Trails (Hard)

Codeforces 对于 Easy 部分的做法: 很容易想到统计下来每个点的位置,枚举到达的点,然后进行转移统计即可。 时间复杂度 \(O(m^2n)\)。 由于个人习惯,代码中的 \(n\) 和 \(m\) 与原题目不同。 代码: #include<b…

双线性四边形等参单元程序(MATLAB实现)

双线性四边形等参单元是有限元分析中最常用的二维单元之一,通过自然坐标(ξ, η)与物理坐标(x, y)的映射,实现复杂形状的单元分析。MATLAB实现,包括形函数计算、坐标变换、雅可比矩阵构建、单元刚度矩阵求解等核…

102302141_易敏亮第四次数据采集作业

课程 数据采集仓库 https://gitee.com/lisu6/data_collect/tree/master/4作业1东方财富 selenium https://gitee.com/lisu6/data_collect/tree/master/4/作业2慕课selenium https://gitee.com/lisu6/data_collect/tree…

李宏毅机器学习笔记41 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

P6706 [COCI 2010/2011 #7] KUGLICE

洛谷 由于每一个节点最多只会连出一条边,所以一个连通的图必定是基环树或者树。 如果是基环树,那么一定会有环,且经过移动后必定在环内,直接按照有环的情况输出即可。 对于一颗树,我们可以将这一个节点连向的点视…

P3596 [POI 2015 R3] 高速公路现代化 Highway modernization

洛谷 首先对于最大值,很容易想到找一条边拆掉,然后把两个直径相连,此时最长直径就是两个树的直径和再加一。 而对于最小值,我们将拆出来的两个树找中点,把中点连起来,此时就是两个的直径折半向上取整的和加一以及…

AT_arc179_d [ARC179D] Portable Gate

AtCoder 以出发点为根,我们可以发现门一定在一个节点的祖先上,如果你走到一个点放下门,再继续走子树部分,然后去走其它子树时,一定会经过放门的这个点,那么此时这个门在这已经没有用了,如果你先去走其它子树,可…

AI Browser:我用 CC 做了个桌面版 Manus

一、项目背景 作为一名开发者,我经常需要做一些重复性的网页操作:每天采集特定网站的数据 定期检查某些信息的更新 批量处理网页表单 自动化测试这些任务虽然简单,但手动操作费时费力。我尝试过用 Puppeteer、Playwrig…

P3576 [POI 2014] MRO-Ant colony

洛谷 一个比较简单的思路,不需要二分。 考虑逆向操作,从路径两端开始处理数值范围,将蚂蚁群大小视为一次查询。 由于树的两点之间的简单路径只有一条,所以每个点的范围是唯一的。 处理时和 \(10^9\) 取最小值,因为…

flink 1.20 物化表(Materialized Tables) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

P4953 [USACO02FEB] Cow Cycling

洛谷 一眼动态规划。 但是我们状态怎么设置? 我们分析题目,可以发现一个领头一定要开到最后,不再成为领头。 原因很简单,如果你把这只领队重新放回队尾,那么它在其它奶牛领队后跑了几圈,它最后能跑的圈数比其他没…

CF700B Connecting Universities

Codeforces 看题目如果直接从如何配对的角度去考虑的话,还是比较困难的。 但是我们不只能从点的角度入手,我们也可以尝试从边的角度入手。 一条边如果要被两个点之间的最短路径经过,那么这两个点一定分别分布在这一…

大模型算法学习

基础知识 一、NLP基础知识 1.词嵌入模型 2.序列模型 二、Transformer基础 三、预训练模型 1.BERT 2.GPT 3.T5 四、预训练技术 五、微调技术 六、强化学习

Linux——网络命令和常用服务 - 指南

Linux——网络命令和常用服务 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monac…

用 GitHub issue 寫博客很好,但我要放棄了

這曾經是一個比火熱的寫作方式,至少在 2020 年是如此,我也是聽、看 laike9m 和 yihong618 的項目慢慢摸索的,它有很多優點,比如至少解決了如下的問題:文章託管:所有文件放在 GitHub,他的穩定性至少要比你電腦的…

P11580 [CCC2020] Escape Room

洛谷 发现直接从起点开始不好处理,可以考虑从终点倒过来处理。 假设目前在位置 \((x,y)\) 那么下一次一定是选择值为 \(x\times y\) 的区域。 那么我们开按照当前区域的值存下这个区域的位置,使用广搜处理,记录每一…

用 Astro 重做網站這件事

Astro 是什麼 核心思想是羣島架構,不同與傳統 VUE 的單頁應用,而是對於不用頁面按需加載,在網頁加載速度和架構兼容性上來說是一流。 模板的注入類似 Jekyll,但是比前者更加靈活。 Bun 是什麼 是用 Zig 語言實現的…

周边的车间厂房工厂通风降温工业冷风机源头厂家,有热源的车间通风降温/铁皮厂房车间降温/铁皮房车间厂房降温工业冷风机供应商有哪些

【苏州讯】随着全球制造业对生产环境与能耗成本的日益关注,工业厂房的通风降温问题已成为影响生产效率与企业可持续发展的关键因素。近日,记者走访了位于苏州的工业通风降温设备制造商——苏州蓝美达机电有限公司,深…

P6875 [COCI2013-2014#6] KRUŽNICE

洛谷 由样例可以知道,一个圆只贡献一个区域,而一个圆在中间被几个圆完全连接时会被分成两个部分,计算两个贡献。 那么我们很容易想到先按照左端点排序,在左端点相同时,比较半径大小。 然后从后向前连接,如果前面…

美化 BroadcastChannel

原項目設計很新穎,用 Cloudflare / Netlify / Vercel 等平臺天然支持 SSR 特性,完成了原網頁 https://t.me/s/ 的代理工作。最重要的是,這些平臺作爲中間轉發(代理),可以直接讓國內訪問到這部分內容(受衆 ++)。…