8.17 拼拼图的小杉 1536
- 题目
- 题解
- 代码
题目
背景 Background
小杉的幻想来到了经典日剧《死亡拼图》的场景里……
被歹徒威胁,他正在寻找拼图
突然广播又响了起来,歹徒竟然又有了新的指示。
小杉身为新一代的汤浅,有责任带领大家脱离危险!
(若对情节有任何疑问,请观看原剧)
描述 Description
歹徒告诉小山,他正在寻找的拼图块其实可以拼成N幅有顺序的拼图。
每幅完整的拼图由若干块拼图块组成,输入中包含每幅拼图所含的拼图块数目。
歹徒要求小杉把所有幅拼图按给出的顺序划分成M个集合,一个拼图集合由若干幅完整的拼图组成,并且总的拼图块的数目不超过T。并且,构成集合的拼图是不能交叉的,例如,当完整拼图1与完整拼图3被放在拼图集合1中之后,完整拼图2就只能放进拼图集合1或者不放进任何拼图集合。
小杉要找出划分成M个集合后,M个集合中最多能有多少幅完整的拼图。
意思就是:
对于n个数,把它们划分成m段,每段的数之和必须小于等于t,可以抛弃任意数字,求最多能留下多少个数。
题解
一看就知道是动态规划啦(知道有什么用,能得分吗)
刚开始考虑的是f[i,j]表示取到第i个数,已经划分了j段,然而题意都理解错了,直接WA
看了题解,恍然大悟:原来如此!(真的是恍然大悟吗)
f[i,j]表示前i个数取了j个最少需要的集合个数
a[i,j]表示前i个数取了j个时当前段中的的数大小
然后考虑状态转移
此时可以效仿01背包,每个数都可以考虑取和不取两种状态,若不取就是f[i,j]=f[i-1,j],a[i,j]=a[i-1,j];若取就麻烦一点
1.上一个集合放不下了,即a[i-1,j-1]+a[i]>t,则新开一个集合,f[i,j]=f[i-1,j-1]+1
2.上一个集合可以放,即a[i-1,j-1]+a[i]<=t,则直接放入上一个集合,f[i,j]=f[i-1,j-1]
注意要判断取和不取那种情况更优
找答案时应在f[n,i](a[n,i]<=m)中找——为什么小于m也可以?因为设m=4,若可以分成3个集合,很显然也可以分成4个集合
至于一维,在二维基础上修改即可
时间复杂度O(n^2)强势n^2
代码
先附上一个比较容易理解的二维代码
varf,a:array[0..1005,0..1005]of longint;b:array[0..1005]of longint;n,m,t,i,j,k:longint;
beginreadln(n,m,t);for i:=1 to n doread(b[i]);fillchar(f,sizeof(f),$7f);f[0,0]:=1;a[0,0]:=0;for i:=1 to n dofor j:=1 to i dobeginif (a[i-1,j-1]+b[i]<=t) thenbeginf[i,j]:=f[i-1,j-1];a[i,j]:=a[i-1,j-1]+b[i];endelseif a[i-1,j-1]+b[i]>t thenbeginf[i,j]:=f[i-1,j-1]+1;a[i,j]:=b[i];end;if (f[i-1,j]<f[i,j])or(f[i-1,j]=f[i,j])and(a[i-1,j]<a[i,j]) thenbegin f[i,j]:=f[i-1,j];a[i,j]:=a[i-1,j];end;end;for i:=1 to n doif (f[n,i]<=m) then k:=i;writeln(k);
end.
这个一维代码是在二维代码的基础上修改的,时间差不多,可以一定程度上省内存
varf,a:array[0..1005]of longint;b:array[0..1005]of longint;n,m,t,i,j,k:longint;
beginreadln(n,m,t);for i:=1 to n doread(b[i]);fillchar(f,sizeof(f),$7f);f[0]:=1;a[0]:=0;for i:=1 to n dofor j:=i downto 1 dobeginif (a[j-1]+b[i]<=t) thenbeginif (f[j-1]<f[j])or(f[j-1]=f[j])and(a[j-1]+b[i]<a[j]) thenbeginf[j]:=f[j-1];a[j]:=a[j-1]+b[i];end;endelseif a[j-1]+b[i]>t thenif (f[j-1]+1<f[j])or(f[j-1]+1=f[j])and(b[i]<a[j]) thenbeginf[j]:=f[j-1]+1;a[j]:=b[i];end;end;for i:=1 to n doif (f[i]<=m) then k:=i;writeln(k);
end.
8.17 拼拼图的小杉 1536相关推荐
- Vijos - 拼拼图的小杉(背包)
题目链接:https://vijos.org/p/1392 题目背景 小杉的幻想来到了经典日剧<死亡拼图>的场景里-- 被歹徒威胁,他正在寻找拼图(-.-干嘛幻想这么郁闷的场景--). 突 ...
- VIJOS1392拼拼图的小杉
题目大意 给定n个数,将这n个数中的一些依次放进m个集合,每个集合中所有数的和不能超过T.集合包含的元素不能交叉,也就是说如果第1个数和第3个数放入了集合1,那么第2个数要么放入集合1,要么不放入任何 ...
- 8.17 想越狱的小杉 1535
题目 题解 代码 题目 背景 Background 这次小杉来到了经典美剧<越狱>的场景里-- 他被抓起来了(-.-干嘛幻想这么郁闷的场景--). 小杉身为新一代的Scofield,在挖了 ...
- 8.17 婚礼上的小杉 1533
题目 题解 代码 题目 背景Background 小杉的幻想来到了经典日剧<求婚大作战>的场景里-- 他正在婚礼上看幻灯片,一边看着可爱的新娘长泽雅美,一边想,如果能再来一次就好了(-.- ...
- 数字拼图java小程序_JS写的数字拼图小游戏代码[学习参考]
昨天没事做,就用JS写了个数字拼图的小游戏,自娱自乐. 可惜关于逆序数的问题还没解决,现在有时是拼不成的,大家见谅了. 拼图 td.numTd{ width : 20px ; height : 20p ...
- SSM同城拼车微信小程序的开发 计算机毕设源码20625
摘要 伴随着科技进步和经济全球化,人民生活水乎丕断提高,拥有私家车的人群也越来越庞大.据统计,我国汽车保有量持续高速度增长,众多的车辆上路,是造成交通拥堵的最主要原因.除此之外,随着经济高速发展,城市 ...
- 。rdquo;小杉很平静的飞鸽传书2009
“你说那个人会是谁呢?”“不知道呀.”小杉很平静的飞鸽传书2009,但换来了&hllip;&hllip;“大姐,你放了我吧,真行,你自己都不知道喜欢谁,那还剩,还剩,等会我算算,哦89 ...
- 拼团商城小程序高保真原型模板、支付、优惠券、客服、物流、收藏、足迹、优惠券、订单管理、评价、设置、地址、售后、拼团、消息通知、商城小程序、电商小程序、拼团电商、移动端电商、高保真电商、电商app
主要功能:首页:(轮播图.活动快速入口.商品推荐).搜索 分类: 商品分类(三级显示).商品详情.拼团or单独购买.订单结算.拼团状态 消息:(客服.通知.物流.活动)我的:收藏.足迹.优惠券.订单 ...
- 微信拼车小程序无服务器,滴滴顺风车下架 拼车微信小程序笑了
当前中国有13-14亿人,机动车的注册量已经有3亿!如此大的人口体量,以及如此少的机动车数量,所以有着诸多的出行压力,所以当前在交通机动车出行方面具有非常重大的潜力,百度,支付宝等也都 ...
最新文章
- 检查Lync SRV记录是否正常
- 一个简单的第三方CNN自编码matlab工具箱
- 双端队列 BFS + Chamber of Secrets CodeForces - 173B
- linux cp后文件变大,使用 rsync 复制大文件的一些误解 | Linux 中国
- 索引 | 学堂原创推文汇总-v2
- dsu on tree入门
- [转载] (三)Python关键字和内置函数
- Python字符串isprintable()
- GridView中添加自动编号,以及鼠标经过时行背景色变和删除时提示。
- 前端开发:报错Error in created hook:”SyntaxError:Unexpected token u in JSON at position 0”…解决方法
- ckplayer只调用html,CKplayer 新手入门超简单使用教程
- 谷歌浏览器网页截屏插件工具下载与安装——FireShot
- AC 自动机算法 JAVA代码 实现
- 对分易教学平台考勤漏洞探索,批量签到app制作杂谈
- AutoJs学习-实现momo点赞
- 2012, PPSN,Geometric Semantic Genetic Programming,GSGP
- Qt QNetwork 下载文件
- oracle 基本语句
- mac电脑开机进入grub界面
- 区块链:“我还活在1994!”