2287. 【POJ Challenge】消失之物(数组递推\分治优化背包)

2287. 【POJ Challenge】消失之物

这题的思想和P4564 [CTSC2018]假面优化的思想一样,应该反过来说,假面那个题应该是借鉴这题的思路。

显然不能枚举每个物品消失O(n)O(n)O(n),然后跑背包O(nm)O(nm)O(nm)

预处理dp
fjf_jfj表示nnn个物品装满体积为jjj的背包的方案数。
gi,jg_{i,j}gi,j表示除了第iii个物品其他n−1n-1n1个物品装满体积为jjj的背包的方案数。

显然fj=gi,j+gi,j−vif_j=g_{i,j}+g_{i,j-v_i}fj=gi,j+gi,jvi,于是gi,j=fj+gi,j−vig_{i,j}=f_j+g_{i,j-v_i}gi,j=fj+gi,jvi

预处理fjf_jfj后我们可以O(n)O(n)O(n)递推gi,jg_{i,j}gi,j(g数组第一维显然没有必要)

#include<cstring>
#include<iostream>
using namespace std;
constexpr int N=2010;
int n,m;
int f[N],g[N];
int v[N];
int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);cin>>n>>m;for(int i=1;i<=n;i++) cin>>v[i];f[0]=1;for(int i=1;i<=n;i++)for(int j=m;j>=v[i];j--)f[j]=(f[j]+f[j-v[i]])%10;for(int i=1;i<=n;i++){memset(g,0,sizeof g);for(int j=0;j<v[i];j++) g[j]=f[j];for(int j=v[i];j<=m;j++) g[j]=((f[j]-g[j-v[i]])%10+10)%10;for(int j=1;j<=m;j++) cout<<g[j];cout<<'\n';}return 0;
}

上面的trick非常巧妙,但是下面有一种方法,不如说是一种框架——分治 更值得去学习掌握。

寒假训练的时候就有一个分治的问题
XVIII Open Cup named after E.V. Pankratiev. Eastern Grand Prix K. King and ICPC不过现在没有oj测评没法补了~~就补个这个题吧(虽然分治里面不一样,不过都是分治的框架)

LinnBlanc题解分治背包

//O(nmlogn)
#include<cstring>
#include<iostream>
using namespace std;
constexpr int N=2010;
int n,m;
int v[N],f[15][N];
void solve(int u,int l,int r)
{if(l==r) {for(int j=1;j<=m;j++) cout<<f[u-1][j];cout<<'\n';return;}int mid=l+r>>1;for(int j=0;j<=m;j++) f[u][j]=f[u-1][j];for(int i=mid+1;i<=r;i++)for(int j=m;j>=v[i];j--)f[u][j]+=f[u][j-v[i]],f[u][j]%=10;solve(u+1,l,mid);for(int j=0;j<=m;j++) f[u][j]=f[u-1][j];for(int i=l;i<=mid;i++)for(int j=m;j>=v[i];j--)f[u][j]+=f[u][j-v[i]],f[u][j]%=10;solve(u+1,mid+1,r);}
int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);cin>>n>>m;for(int i=1;i<=n;i++) cin>>v[i];f[0][0]=1;solve(1,1,n);return 0;
}

upd:2021/3/8 下面题目效仿上面分治的做法即可

P4095 [HEOI2013]Eden 的新背包问题

同样可能少一个物品,按照上面分治的思路预处理少某个物品的背包即可。

多重背包->二进制优化(单调队列不会,难写

时间复杂度O(nmlog⁡2n+q)O(nm\log ^2n+q)O(nmlog2n+q)

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
constexpr int N=1010;
int n,m,q;
int v[N*10],w[N*10],cnt;
int L[N],R[N];
int f[15][N],ans[N][N];
void update(int u,int l,int r)
{for(int i=L[l];i<=R[r];i++)for(int j=m;j>=v[i];j--)f[u][j]=max(f[u][j],f[u][j-v[i]]+w[i]);
}
void solve(int u,int l,int r)
{if(l==r) return memcpy(ans[l],f[u-1],sizeof(ans[l])),void();int mid=l+r>>1;memcpy(f[u],f[u-1],sizeof(f[u]));update(u,mid+1,r);solve(u+1,l,mid);memcpy(f[u],f[u-1],sizeof(f[u]));update(u,l,mid);solve(u+1,mid+1,r);
}int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);cin>>n;m=1000;for(int i=1;i<=n;i++){int a,b,c;cin>>a>>b>>c;L[i]=cnt+1;int k=1;while(k<=c){v[++cnt]=k*a;w[cnt]=k*b;c-=k;k*=2;}if(c) {v[++cnt]=c*a;w[cnt]=c*b;}R[i]=cnt;}solve(1,1,n);cin>>q;while(q--){int d,e;cin>>d>>e;++d;cout<<ans[d][e]<<'\n';}return 0;
}

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

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

相关文章

如何用ABP框架快速完成项目(面向项目交付编程面向客户编程篇) - 广州.net微软技术俱乐部12月份活动报名帖...

这是广州.net微软技术俱乐部12月份活动报名帖。此帖会持续更新。活动课程标题是&#xff1a;如何用ABP框架快速完成项目(面向项目交付编程面向客户编程篇)这是内容大纲&#xff1a;ABP框架简介&#xff08;这里会聊聊.net真的不如JAVA吗&#xff1f;&#xff09;快的定义!用ABP…

P5012-水の数列【并查集,RMQ】

正题 题目链接:https://www.luogu.com.cn/problem/P5012 题目大意 nnn个数字的一个序列&#xff0c;TTT次询问给出[l,r][l,r][l,r]要求 找出一个最大的xxx满足。提出所有的小于xxx的数&#xff0c;然后被提出的数的连续区间长度平方和除以xxx的值最大要求分出来的区间个数在[…

牛客题霸 [ 换钱的最少货币数] C++题解/答案

牛客题霸 [ 换钱的最少货币数] C题解/答案 题目描述 给定数组arr&#xff0c;arr中所有的值都为正整数且不重复。每个值代表一种面值的货币&#xff0c;每种面值的货币可以使用任意张&#xff0c;再给定一个aim&#xff0c;代表要找的钱数&#xff0c;求组成aim的最少货币数。…

codeforces gym100959 I - Robots(稠密图建图优化)

I - Robots 显然可以两点之间能连边就连边&#xff0c;但是边数会很多&#xff0c;考虑优化 对于三个点(x0,y0)(x_0,y_0)(x0​,y0​)&#xff0c;(x0,y1)(x_0,y_1)(x0​,y1​)&#xff0c;(x0,y2)(x_0,y_2)(x0​,y2​) 如果三个点的方向都是UUU 那么没有必要1→31\to 31→3连…

.Net Core微服务系列--开篇

得原来有个项目是用wcf做的分布式&#xff0c;不仅横向根据业务拆分了&#xff0c;纵向把业务处理、数据访问等也拆分了成不同的服务&#xff0c;这个是当时公司的产品我也只是一个小小的开发人员所以就不做太多的评论&#xff0c;只是不得不吐槽下调试真的太麻烦。后来&#x…

牛客题霸 [ 树的直径] C++题解/答案

牛客题霸 [ 树的直径] C题解/答案 题目描述 给定一棵树&#xff0c;求出这棵树的直径&#xff0c;即两个节点距离的最大值。 题解&#xff1a; 不知道大家听没听过一个结论&#xff1a; 树的直径可以通过两边dfs找到 步骤&#xff1a; 1.从任意一点进行dfs&#xff0c;然后…

GDOI2021划水记

Day0 上午有意志行&#xff0c;一大早就醒了&#xff0c;然后走了五个小时脚痛。中午洗澡&#xff0c;宿舍轮流看巨人最终话然后聊了一个小时&#xff1f; 下午老师带着我和全爷先开溜&#xff0c;宿舍好像很破旧还还没得充电&#xff0c;领了牌牌和斐爷去吃饭。 然后六点多和…

codeforces1493 D. GCD of an Array(数论)

昨天晚上用的镜像&#xff0c;看的B的图片瞬间不想写了&#xff08;而且这周作业还没碰&#xff09;&#xff0c;不过看到D题突然想做做&#xff0c;于是有了下面的思路&#xff0c;写了一个小时&#xff0c;写完没交看了下榜单发现C题竟然过的人也不多&#xff0c;看了看C题感…

被低估的.net(中) - 广州.net俱乐部2019年纲领

这是被低估的.net系列的中篇。上篇在这里&#xff1a;被低估的.net(上) - 微软MonkeyFest 2018广州分享会活动回顾中篇本来不是这样的&#xff0c;中篇的草稿大纲其实在写上篇之前就写好了&#xff0c;嗯&#xff0c;当时给张队长看过了。然而却因为被.net 粉丝的热情震惊和感动…

P7518-[省选联考2021A/B卷]宝石【主席树,二分】

正题 题目链接:https://www.luogu.com.cn/problem/P7518 题目大意 给出nnn个点的一棵树&#xff0c;每个点上有不大于mmm的数字。 然后给出一个长度为ccc的各个位数不同的序列&#xff0c;每次询问一条路径上找到一个最大的kkk使得该序列的存在1∼k1\sim k1∼k的子序列。 1≤…

牛客题霸 [ 缺失数字] C++题解/答案

牛客题霸 [ 缺失数字] C题解/答案 题目描述 从0,1,2,…,n这n1个数中选择n个数&#xff0c;找出这n个数中缺失的那个数&#xff0c;要求O(n)尽可能小。 题解&#xff1a; 我们可以用map来标记已出现过的数字 因为数组长度给出是len&#xff0c;因为是连续的数字&#xff0c;…

bzoj 2908. 又是nand(树链剖分+区间NAND+单点修改)

首先考虑问题的简化版 存在下面两个操作 询问[l,r][l,r][l,r]区间与非的值即alNANDal1NAND…NANDara_l \text{NAND} a_{l1} \text{NAND}\dots \text{NAND} a_ral​NANDal1​NAND…NANDar​单线修改p,xp,xp,x即apxa_pxap​x 这是一道去年校赛题最近才发现区间与非的板子题 首…

[译]RabbitMQ教程C#版 - 远程过程调用(RPC)

先决条件本教程假定 RabbitMQ 已经安装&#xff0c;并运行在localhost标准端口&#xff08;5672&#xff09;。如果你使用不同的主机、端口或证书&#xff0c;则需要调整连接设置。从哪里获得帮助如果您在阅读本教程时遇到困难&#xff0c;可以通过邮件列表 联系我们。在第 教程…

P7514-[省选联考2021A/B卷]卡牌游戏【贪心】

正题 题目链接:https://www.luogu.com.cn/problem/P7514 题目大意 给出nnn个卡牌有ai/bia_i/b_iai​/bi​&#xff0c;开始都是aia_iai​朝上&#xff0c;将不超过mmm张卡牌变为bib_ibi​面朝上&#xff0c;使得朝上的数字中最大值减去最小值最小。 3≤n≤106,1≤m<n,1≤a…

牛客题霸 [ 旋转数组] C++题解/答案

牛客题霸 [ 旋转数组] C题解/答案 题目描述 一个数组A中存有N&#xff08;N&gt0&#xff09;个整数&#xff0c;在不允许使用另外数组的前提下&#xff0c;将每个整数循环向右移M&#xff08;M>0&#xff09;个位置&#xff0c;即将A中的数据由&#xff08;A0 A1 ………

ML.NET速览

什么是ML.NET&#xff1f;ML.NET是由微软创建&#xff0c;为.NET开发者准备的开源机器学习框架。它是跨平台的&#xff0c;可以在macOS&#xff0c;Linux及Windows上运行。机器学习管道ML.NET通过管道(pipeline)方式组合机器学习过程。整个管道分为以下四个部分&#xff1a;Loa…

P6240 好吃的题目(分治+背包)

P6240 好吃的题目 类似于线段树分治&#xff0c;在每个节点预处理[l,mid],[mid1,r][l,mid],[mid1,r][l,mid],[mid1,r]的背包&#xff0c;然后询问即可 一般代码就类似下面的写法&#xff0c;但是此题有点卡空间于是稍微优化了一下空间。 时间复杂度O{nlog⁡nmax⁡(hi,ti)}O\{…

CF990G-GCD Counting【dfs】

正题 题目链接:https://www.luogu.com.cn/problem/CF990G 题目大意 给出一棵有点权的树&#xff0c;对于每个kkk求有多条路径的点权gcdgcdgcd为kkk 1≤n≤2105,1≤ai≤21051\leq n\leq 2\times 10^5,1\leq a_i\leq 2\times 10^51≤n≤2105,1≤ai​≤2105 解题思路 开始以为要…

牛客题霸 [ 旋转数组的最小数字] C++题解/答案

牛客题霸 [ 旋转数组的最小数字] C题解/答案 题目描述 把一个数组最开始的若干个元素搬到数组的末尾&#xff0c;我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转&#xff0c;输出旋转数组的最小元素。 NOTE&#xff1a;给出的所有元素都大于0&#xff0c;若数组…

.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划

写在前面千呼万唤始出来&#xff0c;首先&#xff0c;请允许我长吸一口气&#xff01;真没想到一份来自28岁老程序员的自白 这篇文章会这么火&#xff0c;更没想到的是张善友队长的公众号居然也转载了这篇文章&#xff0c;这就导致两天的时间就有两百多位读者朋友加入了.NET Co…