- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Zuma解题报告
PAGE1 / NUMPAGES3
ZUMA(祖玛问题)解题报告
【SOURCE】2010NOIP连云港模拟 ROUND1第二题
类似题目:POJ2915ZUMA JSOI2007 ZUMA
【DESCRIPTION】
一天陈实来到海州锦屏山玩,在山谷草丛中他发有N(1≤N≤100)个有颜色的大理石(大理石并不一定“大”)排在一列。他还发现它们有一种特性:当他触摸连续K(2≤k≤5)个或大于K个的同一色彩的大理石后,它们先是闪烁,再接着是消失了。陈实在家中带了足够多的N个颜色的大理石,他可以将它放在任意的大理石之间(开头与结束也可以放)。
请帮助陈实放入最少的大理石,从而使所有大理石全部消失。
【INPUT】
输入文件zuma.in共两行:
第一行两个整数N与K;
第二行有N个数(每个数都在1到100之间,且有一个空格格开),这代表陈实发现N个有颜色的大理石。
【OUTPUT】
输出文件zuma.out只有一行;
输出最小放入几个大理石,可以使所有的大理石消失。
【SAMPLE】
【sample1】
zuma.in
2 5
1 1
zuma.out
3
【sample2】
zuma.in
5 3
2 2 3 2 2
zuma.out
2
【sample】
zuma.in
10 4
3 3 3 3 2 3 1 1 1 3
zuma.out
4
【SOLUTION】
经典DP问题zuma,数据范围较小为1~100,对于某区间内的石头进行处理求解,于是想到三位状态表示,可以在1s内出解,但状态的表示的确是本题之关键所在,我们来看下面的分析:
如何简化数据?
蛋疼之处!连续重复的石头可以合并为一个二元组——c[i]表示颜色,n[i]表示数量
这样就避免了很多重复运算
如何表示状态?
三维状态f[I,j,k]表示需要达成此状态需要的最小石子数 :i、j表示石子i和石子j(以下的石子都是二元组,不考虑单独的石子),那么k怎么表示才能使状态无后效性呢,关键在于祖玛游戏中的一种奖励机制——连消加成,我们从这里得到启示,是不是可以达成石子j和k个与j颜色相同的石子进行连消呢?当然,我们并不强调k个石子在序列中的位置,不存在的k可以认为是一种废状态,题目描述中还认为并不是石子连续超过一定数量就会自动消除,因此不用讨论k+s[j]的范围,这样我们的工作就大大减轻了。
除此以外,我们可以发现消除的关键并不是将某一段完全消除,而是将某一段消去形成的状态与其他石子进行组合使得石子数量达到可以消除的石子数量,即可以组合的石子数,k的加入使得状态没有后效
状态如何转移?
清楚了状态的表示,状态的转移就很容易了,考虑从i到j一段的石子,如果其中存在与j颜色相同的石子e,那么即可达成状态i-j序列内部的连消,那么首先需要做的就是消除从e+1到j-1之间石子的没有外部连消的消除(如果有连消的话就会破坏e和j两块石子),在进行k块石子与石子j进行连消:
F[I,j,k]=min{F[I,e,k+s[j]]+F[e+1,j-1,0]}
另外还应该考虑外部连消的情况,也就是说要将i到j-1的石子以没有与j-1 颜色相同的石子连消的状态完全删去,那么j石子就要带上k块与之相同颜色的石子进行消除,rest表示达成连消还需要增加的石子数,此时:
F[I,j,k]=min{F[I,j,k],F[I,j-1,0]+rest[s[j]+k]}
【CODE】
program zuma;
var f:array[0..101,0..101,0..101] of longint; eliminate?
c,s,rest:array[0..101] of longint;
i,j,k,n,m,ans:longint;
function dfs(i,j,k:longint):longint;
var tm1,tm2,e:longint;
begin
if f[i,j,k]-1 then exit(f[i,j,k])
else begin
tm1:=maxlongint;
for e:=i to j-1 do
if c[e]=c[j]
then begin
tm2:=dfs(i,e,s[j]+k)+dfs(e+1,j-1,0);
if tm2tm1 then tm1:=tm2;
end;
文档评论(0)